Миграции — это как рецепты для базы данных. Вы описываете изменения, а Yii2 применяет их к базе. Забудьте о ручном изменении таблиц через phpMyAdmin — миграции сделают всё сами. В этой статье я расскажу, как использовать миграции в Yii2, чтобы ваша база всегда была в порядке.
Что такое миграции и зачем они нужны
Представьте, что вы работаете в команде. Один разработчик добавил поле в таблицу, другой — удалил индекс, третий — создал новую таблицу. Без миграций база данных превратится в хаос. Миграции — это версионирование схемы базы данных. Они позволяют:
- Применять изменения на любом окружении (разработка, тестирование, продакшн).
- Откатывать изменения, если что-то пошло не так.
- Хранить историю изменений в коде.
В Yii2 миграции — это PHP-классы, которые наследуются от yii\db\Migration. Они содержат два метода: up() для применения изменений и down() для отката.
Создание миграции: первый шаг
Чтобы создать миграцию, откройте консоль и выполните:
yii migrate/create create_users_table
Yii сгенерирует файл в папке migrations с именем вроде m240101_120000_create_users_table.php. Откройте его — вы увидите примерно такой код:
<?php
use yii\db\Migration;
class m240101_120000_create_users_table extends Migration
{
public function up()
{
// код для применения миграции
}
public function down()
{
// код для отката миграции
}
}
Теперь заполним методы. Например, создадим таблицу users:
public function up()
{
$this->createTable('{{%users}}', [
'id' => $this->primaryKey(),
'username' => $this->string()->notNull(),
'email' => $this->string()->notNull()->unique(),
'created_at' => $this->integer()->notNull(),
]);
}
public function down()
{
$this->dropTable('{{%users}}');
}
Обратите внимание на {{%users}} — это синтаксис для автоматической подстановки префикса таблицы, если он задан в конфиге.
down() так, чтобы он полностью отменял up(). Иначе откат миграции может привести к ошибкам.
Применение и откат миграций
Чтобы применить все новые миграции, выполните в консоли:
yii migrate
Yii покажет список миграций, которые будут применены, и спросит подтверждение. После применения в таблице migration появится запись о выполненной миграции.
Если нужно откатить последнюю миграцию:
yii migrate/down
А чтобы откатить все миграции:
yii migrate/down all
Также можно указать количество шагов для отката:
yii migrate/down 3
Полезно знать: команда yii migrate/redo откатывает и заново применяет последнюю миграцию. Удобно для тестирования.
Продвинутые возможности миграций
Миграции в Yii2 — это не только создание таблиц. Они умеют:
- Добавлять и удалять столбцы:
$this->addColumn('{{%users}}', 'status', $this->integer()->defaultValue(0)); - Создавать индексы:
$this->createIndex('idx-users-email', '{{%users}}', 'email'); - Добавлять внешние ключи:
$this->addForeignKey('fk-posts-user_id', '{{%posts}}', 'user_id', '{{%users}}', 'id', 'CASCADE', 'CASCADE'); - Выполнять произвольный SQL:
$this->execute('UPDATE users SET status = 1');
Также можно использовать batchInsert() для вставки данных и createTable() с опциями вроде ENGINE=InnoDB.
$this->alterColumn('{{%users}}', 'email', $this->string(255)->notNull());. Но помните, что не все СУБД поддерживают эту операцию.
Таблица методов миграций
Вот основные методы, которые вы будете использовать в миграциях:
| Метод | Описание |
|---|---|
| createTable() | Создаёт новую таблицу |
| dropTable() | Удаляет таблицу |
| addColumn() | Добавляет столбец в таблицу |
| dropColumn() | Удаляет столбец |
| createIndex() | Создаёт индекс |
| addForeignKey() | Добавляет внешний ключ |
| batchInsert() | Вставляет несколько строк за раз |
| execute() | Выполняет произвольный SQL |
Советы и лучшие практики
За годы работы с Yii2 я выработал несколько правил, которые помогают избежать головной боли:
- Никогда не редактируйте уже применённые миграции. Если нужно исправить, создайте новую миграцию.
- Используйте транзакции. Оберните
up()иdown()в$this->beginTransaction()и$this->commit(), если ваша СУБД поддерживает транзакции для DDL. - Тестируйте откат. После применения миграции всегда проверяйте, что
down()работает корректно. - Не забывайте про префиксы. Используйте
{{%table}}вместоtable, чтобы код был переносимым. - Разделяйте логические изменения. Одна миграция — одно действие. Так проще откатывать.
yii migrate --interactive=0 для автоматического подтверждения.
Что в итоге
Миграции в Yii2 — это мощный инструмент для управления схемой базы данных. Они делают разработку командной и предсказуемой. Освоив создание, применение и откат миграций, вы забудете о ручных правках. Помните: миграции — это код, а значит, их можно версионировать, тестировать и автоматизировать. Начните использовать их в своём проекте уже сегодня, и ваша база скажет вам спасибо.
Студия WNDER

