Laravel: Все секреты миграции
В Laravel миграции — способ управления и применения изменений в схеме базы данных. Смотрите на это как на phpMyAdmin, но с кодом вместо пользовательского интерфейса. Они позволяют поддерживать синхронизацию всех ваших сред.
Как создать миграцию в Laravel
Создать миграцию может Artisan с помощью следующей команды:
php artisan make:migration CreatePostsTable
- Напишите название миграции в camelCase;
- Artisan преобразует его в snake_case (сделав имя более читабельным);
- В качестве префикса будет добавлена метка времени (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 год. Полное руководство