Laravel: Все секреты миграции

Источник: «php artisan make migration: learn all its secrets»
Миграции необходимы в любом приложение Laravel, использующем базу данных. Я расскажу, что это такое, почему нужно их использовать и как их генерировать.

В Laravel миграции — способ управления и применения изменений в схеме базы данных. Смотрите на это как на phpMyAdmin, но с кодом вместо пользовательского интерфейса. Они позволяют поддерживать синхронизацию всех ваших сред.

Как создать миграцию в Laravel

Создать миграцию может Artisan с помощью следующей команды:

php artisan make:migration CreatePostsTable
  1. Напишите название миграции в camelCase;
  2. Artisan преобразует его в snake_case (сделав имя более читабельным);
  3. В качестве префикса будет добавлена метка времени (timestamp).

Вот пример:

INFO Created migration [2022_09_12_142156_create_posts_table].

Миграция выглядит так:

use IlluminateSupportFacadesSchema;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateDatabaseMigrationsMigration;

return new class extends Migration {
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id();

// Это поля, которые вы хотите добавить в свою таблицу.
$table->string('title');
$table->text('content');

// Это поля "created_at" и "updated_at".
$table->timestamps();
});
}

public function down()
{
Schema::dropIfExists('posts');
}
};

Но есть ещё, кое-что. Знаете ли вы, что можете передавать несколько параметров?

php artisan make:migration

Options:
--create[=CREATE] Создаваемая таблица
--table[=TABLE] Таблица для миграции
--path[=PATH] Местоположение, в котором должен быть создан файл миграции
--realpath Указывает, что любые предоставленные пути к файлам миграции являются предварительно разрешёнными абсолютными путями
--fullpath Вывести полный путь миграции

Давайте рассмотрим как их использовать и зачем.

Создание миграции с параметром --create

Параметр --create указывает Artisan использовать другое имя таблицу, вместо полученного из файла миграции. Это может быть полезно, если вам нужно, например, использовать другой язык из имени таблицы.

php artisan make:migration CreatePostsTable --create=billets

Создание миграции с параметром --table

Параметр --table указывает Artisan, что нужно не создавать новую таблицу, а обновить существующую. Если вы не следуете соглашениям Laravel по именованию своих миграций, этот параметр для вас.

php artisan make:migration Whatever --table=posts

Создание миграции вместе с её моделью

Что мне нравится в Artisan — возможность легко создать модель с её миграцией. Однако для этого нам нужно использовать другую команду.

php artisan make:model Post --migration

Вы можете использовать сокращение для параметра миграции:

php artisan make:model Post -m

И если вы посмотрите на помощь, то увидите, что Artisan может сделать для вас ещё больше:

php artisan make:model -h

Description:
Create a new Eloquent model class

Usage:
make:model [options] [--] <name>

Arguments:
name The name of the class

Options:
-a, --all Генерировать для модели классы: миграции, наполнителя, фабрики, политики, ресурсный контроллер и запроса формы
-c, --controller Создать для модели новый контроллер
-f, --factory Создать для модели новую фабрику
--force Создать класс даже, если модель уже существует
-m, --migration Создать для модели файл миграции
--morph-pivot Указывает, должна ли сгенерированная модель быть пользовательской моделью полиморфной промежуточной таблицей
--policy Создать для модели новую политику
-s, --seed Создать для модели новый наполнитель
-p, --pivot Указывает, должна ли сгенерированная модель быть пользовательской моделью промежуточной таблицей
-r, --resource Указывает, должен ли сгенерированный контроллер быть ресурсным контроллером
--api Указывает, должен ли сгенерированный контроллер быть ресурсным контроллером API
-R, --requests Создать новые классы запроса формы и использовать их в ресурсном контроллере
--test Генерировать сопутствующий PHPUnit тест для Модели
--pest Генерировать сопутствующий Pest test для Модели

Как выполнить миграцию базы данных

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

INFO  Running migrations.

2014_10_12_000000_create_users_table .............................................................................. 4ms DONE
2014_10_12_100000_create_password_resets_table .................................................................... 1ms DONE
2018_01_01_000000_create_action_events_table ...................................................................... 7ms DONE
2019_05_10_000000_add_fields_to_action_events_table ............................................................... 1ms DONE
2019_08_19_000000_create_failed_jobs_table ........................................................................ 1ms DONE

Очистка базы данных перед миграцией

Команда php artisan migrate:fresh очистит вашу базу данных перед миграцией.

Dropping all tables ............................................................................................... 7ms DONE

INFO Preparing database.

Creating migration table .......................................................................................... 3ms DONE

INFO Running migrations.

2014_10_12_000000_create_users_table .............................................................................. 2ms DONE
2014_10_12_100000_create_password_resets_table .................................................................... 1ms DONE
2018_01_01_000000_create_action_events_table ...................................................................... 6ms DONE
2019_05_10_000000_add_fields_to_action_events_table ............................................................... 1ms DONE
2019_08_19_000000_create_failed_jobs_table ........................................................................ 1ms DONE

Эта команда не будет работать в продакшене, чтобы предотвратить катастрофу.

Как откатить назад миграцию

Откатите назад любые изменения с помощью команды php artisan migrate:rollback. Как видно ниже, откат выполняется в обратном порядке.

INFO  Rolling back migrations.

2019_08_19_000000_create_failed_jobs_table ........................................................................ 1ms DONE
2019_05_10_000000_add_fields_to_action_events_table ............................................................... 8ms DONE
2018_01_01_000000_create_action_events_table ...................................................................... 1ms DONE
2014_10_12_100000_create_password_resets_table .................................................................... 1ms DONE
2014_10_12_000000_create_users_table .............................................................................. 1ms DONE

Поэтому убедитесь, что вы правильно используете метод down(). По сути, метод down() должен действовать противоположно методу up().

use IlluminateSupportFacadesSchema;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateDatabaseMigrationsMigration;

return new class extends Migration {
public function up()
{
Schema::table('posts', function (Blueprint $table) {
// Это поле было boolean, но мы хотим переключиться на datetime.
$table->datetime('is_published')->nullable()->change();
});
}

public function down()
{
Schema::table('posts', function (Blueprint $table) {
// При откате, мы должны восстановить поле в прежнее состояние.
$table->boolean('is_published')->default(false)->change();
});
}
}

Рекомендую ознакомиться с soft delete и рекомендациям по Eloquent в статье Laravel: Рекомендации на 2022 год. Полное руководство

Дополнительные материалы

Предыдущая Статья

Soft delete моделей в Laravel: подробное руководство

Следующая Статья

PHP 7.4: Строгая типизация против Слабой