Нетривиальные вопросы миграций, баз данных в 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(); });