Миграции — это как рецепты для базы данных. Вы описываете изменения, а Yii2 применяет их к базе. Забудьте о ручном изменении таблиц через phpMyAdmin — миграции сделают всё сами. В этой статье я расскажу, как использовать миграции в Yii2, чтобы ваша база всегда была в порядке.

Digital-студия WNDER

Что такое миграции и зачем они нужны

Представьте, что вы работаете в команде. Один разработчик добавил поле в таблицу, другой — удалил индекс, третий — создал новую таблицу. Без миграций база данных превратится в хаос. Миграции — это версионирование схемы базы данных. Они позволяют:

  • Применять изменения на любом окружении (разработка, тестирование, продакшн).
  • Откатывать изменения, если что-то пошло не так.
  • Хранить историю изменений в коде.

В 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