Работа с миграциями в Laravel

209
08 января 2018, 11:02

Такие вопросы по миграциям в Laravel:

  1. Допустим, у меня есть 1 миграция (создание таблицы) - уже сделанная, то есть была набрана команда php artisan migrate, a затем я делаю другие изменения (например, изменение структуры другой таблицы), а потом набираю команду php artisan migrate - обработаются все миграции, включая уже обработанную ранее первую, или Laravel использует в данной ситуации контроль версий (о котором пишется в документации) и обработает только последнюю (новую)?

  2. В контексте первого вопроса, будет лучше делать для каждого действия/для действия с одной и той же таблицей отдельную миграцию или же редактировать ту же самую миграцию, увеличивая batch count?

  3. Метод down(). Правильно ли я понимаю, что если ты в методе run() создал, например, 2 таблицы, добавил колонку в 3-ей и изменил тип данных для колонки в 4-ой, то в методе down() надо вручную в точности сделать всё наоборот, возвращая к состоянию до метода run()?
Answer 1
  1. Тут 2 варианта:

    • Eсли вы разрабатываете, здесь и сейчас, с нуля и поняли, что блин, а вот тут не хватает чего-то,- вы можете сделать php artisan migrate:refresh т.е. сбросить и создать все таблицы

    • У вас команда или проект который уже в работе, и вам нужно добавить, что-то новое, тогда вы должны создать миграцию с двумя методами up и down, причем down будет отменять все то что добавили в up

  2. Этот вопрос закрывается в первом пункте, смотря, что и для чего вам надо.

  3. Лучше конечно что б в одной миграции в 3 таблицы не создавали и каждая миграция имела свое название: например create_statuses_table, add_field_status_to_orders_table, соответственно если вы что-то добавили в up то в down это следует отменять.

Например:

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('shops', function (Blueprint $table) {
        $table->json('suppliers_settings')->nullable()->after('suppliers');
    });
}
/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::table('shops', function (Blueprint $table) {
        $table->dropColumn('suppliers_settings');
    });
}

Так же хорошо делать команду php artisan migrate --step, что бы каждой миграции давался свой номер и потом можно было бы отменять по одной миграции назад при помощи команды php atisan migrate:rollback

Так же перед тем как выкатить на сервер изменение было бы не плохо проверять что у вас обе команды работают верно up() и down(), т.е. запустите разок php artisan migrate --step и php atisan migrate:rollback, что б удостовериться, что все идет без ошибок!