Нетривиальные вопросы миграций, баз данных в Laravel

В документации и учебниках по Laravel везде рассказано как создать таблицу, причём создаётся она от имени пользователя root. Работать с правами пользователя root очень плохая привычка даже на локальном сервере разработчика. Пользователь БД должен иметь минимум прав. В идеале только создавать и даже не все данные просматривать. Парво редактирования должно быть только на необходимые поля, а не на все вообще. Прав delete быть вообще не должно. Записи могут помечаться к удалению, как бы отправляясь в архив. А реальное удаление, если и будет производиться, то уже с задержкой и с правами другого пользователя.

php artisan help make:migration  #справка
php artisan migrate:status #показывает список и статус миграций
php artisan make:migration migration_name #создаёт пустую миграцию
если миграцию ещё не выполнили, тоо есть php artisan migrate:status показывает No, то можно просто удалить файл с миграцией
rm database/migrations/2020_08_12_102455_migration_name.php   
php artisan make:migration migration_name --create=items #создаёт миграцию с созданием таблицы items
[puzzle@localhost doc]$ more database/migrations/2020_08_12_103527_migration_name.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class MigrationName extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('items', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('items');
    }
}



rm database/migrations/2020_08_12_103527_migration_name.php

php artisan make:migration migration_name --table=items #создаёт миграцию для изменения структуры таблицы items

[puzzle@localhost doc]$ more database/migrations/2020_08_12_103754_migration_name.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class MigrationName extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('items', function (Blueprint $table) {
            //
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('items', function (Blueprint $table) {
            //
        });
    }
}
[puzzle@localhost doc]$ more database/migrations/2020_08_12_103754_migration_name.php

rm database/migrations/2020_08_12_103754_migration_name.php

Теперь создададим пару таблиц, их может быть несколько. Проверим как работает откат миграций назад. Тут, как раз, новичка и поджидают нетривиальные сложности, которые не описаны в документации. В теории всё хорошо выглядит когда нужно откатиться на один шаг назад. Кстати, откад назад идёт не по количеству файлов миграции, а по количеству Batch который отображается в команде php artisan migrate:status. В одной партии может быть несколько фалов миграции. php artisan migrate:refresh --step=2 будет означать, что откатываемся назад на миграции из двух последних партий. Итак, проделаем следующие команды, создадим и удалим пару таблиц.

php artisan make:migration create_items_table --create=items #создаёт миграцию для создания таблицы items
php artisan make:migration create_docs_table --create=docs #создаёт миграцию для создания таблицы docs
php artisan migrate #выполняем создание таблиц
#таблицы появились в БД
php artisan migrate:rollback # этой командой можно откатиться на шаг назад и удалить созданные таблицы
php artisan migrate:rollback --step=2 # Откатит на два шага назад и удалит и ранее созданные таблицы, если таковые были
php artisan migrate:reset # удалит все миграции, собственно на первоначальном этапе создания таблиц эта команда вполне полезна, чтобы отладить создание первоначальной структуры данных

php artisan migrate:refresh #этак команда эквивалентна двум следующим
php artisan migrate:reset
php artisan migrate

php artisan migrate:fresh #почти экивалент предыдущей команды. Удаляются все таблицы, а затем выполняется php artisan migrate. Непонятно только зачем она. Это же приведёт к ошибкам, если в базе есть что-то помимо таблиц,
а при выполнении php artisan migrate эти объекты не смогут повторно создасться.

В реальной жизни вам скорее придётся удалять таблицу, которую создали когда-то давно. И тут откат назад не подходит, так как приведёт к удалению таблиц, которые были созданы после таблицы, которую нам нужно удалить. А на рабочем проекте уже в таблицах данные. Поэтому придётся создать пустую миграцию php artisan make:migration drop_table_name в методе up которой прописать Schema::dropIfExists('table_name');

Миграции будут хранить всю историю изменения структуры БД.

Для созадния структуры таблиц и заполнения данными используйте следующий код.

    public function up()
    {
        Schema::create('ftypes', function (Blueprint $table) {
            $table->integer('g_type')->unsigned()->comment('&1 - doc, &2 - sheet');
            $table->string('extension', 16)->primary();
            $table->string('name', 32)->unique();
            $table->string('mime_type', 128)->unique();
            

        });

                        
        DB::table('ftypes')->insert(
        [
            ['g_type'=> config('global.g_type_doc'), 'extension'=>'html', 'name'=>'html', 'mime_type'=>'text/html'],
            
            ['g_type'=> config('global.g_type_doc') |
                        config('global.g_type_sheet'), 'extension'=>'html.zip', 'name'=>'html (zip)', 'mime_type'=>'application/zip'],
            
            ['g_type'=> config('global.g_type_doc'), 'extension'=>'txt', 'name'=>'text', 'mime_type'=>'text/plain'],
            ['g_type'=> config('global.g_type_doc'), 'extension'=>'rtf', 'name'=>'rtf', 'mime_type'=>'application/rtf'],
            ['g_type'=> config('global.g_type_doc'), 'extension'=>'doc', 'name'=>'Open Office doc', 'mime_type'=>'application/vnd.oasis.opendocument.text'],
            
            ['g_type'=> config('global.g_type_doc') |
                        config('global.g_type_sheet'), 'extension'=>'pdf', 'name'=>'pdf', 'mime_type'=>'application/pdf'],
            
            ['g_type'=> config('global.g_type_doc'), 'extension'=>'docs', 'name'=>'MS Word', 'mime_type'=>'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],
            ['g_type'=> config('global.g_type_doc'), 'extension'=>'epub.zip', 'name'=>'epub (zip)', 'mime_type'=>'application/epub+zip'],
            
            ['g_type'=> config('global.g_type_sheet'), 'extension'=>'xls', 'name'=>'MS Excel', 'mime_type'=>'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],
            ['g_type'=> config('global.g_type_sheet'), 'extension'=>'odt', 'name'=>'Open Office sheet', 'mime_type'=>'application/x-vnd.oasis.opendocument.spreadsheet'],
            ['g_type'=> config('global.g_type_sheet'), 'extension'=>'csv', 'name'=>'csv', 'mime_type'=>'text/csv'],
        ]
        );
    }   

Для изменения структуры таблиц используйте следующий код.

Schema::table('table_name', function (Blueprint $table) {
    $table->string('param_name', 50)->change();
});    
Телеграмм ITSOFT