Представь, что ты строишь дом. Фундамент залил, стены возвёл, крышу накрыл. А потом решил перепланировку — добавить окно или перенести дверь. Без нормального инструмента ты бы сломал всё к чертям. В разработке то же самое: база данных — это фундамент твоего приложения. И когда нужно что-то поменять в структуре таблиц, без миграций ты рискуешь потерять данные или сломать проект. В этой статье я расскажу, как работать с миграциями в Yii2, чтобы всё было гладко и без боли.

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

Миграции — это как контроль версий для твоей базы данных. Ты пишешь код на PHP, который описывает изменения: создать таблицу, добавить поле, изменить тип данных. Этот код можно запускать на разных серверах (локально, на стейджинге, на проде) и откатывать, если что-то пошло не так. Yii2 предоставляет встроенный инструмент для этого — консольную команду yii migrate. Без миграций разработчики часто правят базу вручную через phpMyAdmin или SQL-запросы, а потом забывают синхронизировать изменения. В итоге — баги, потеря данных и маты в чате. Миграции решают эту проблему.

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

Как создать и запустить миграцию?

В Yii2 миграции — это классы, которые наследуются от yii\db\Migration. Они лежат в папке console/migrations. Чтобы создать новую миграцию, используй консольную команду:

php yii migrate/create create_user_table

После этого Yii2 сгенерирует файл с именем вроде m250101_123456_create_user_table.php. Внутри — два метода: safeUp() и safeDown(). В первом ты пишешь, что нужно сделать (например, создать таблицу), во втором — как это откатить (удалить таблицу). Пример:

use yii\db\Migration;

class m250101_123456_create_user_table extends Migration
{
    public function safeUp()
    {
        $this->createTable('user', [
            'id' => $this->primaryKey(),
            'username' => $this->string()->notNull()->unique(),
            'email' => $this->string()->notNull()->unique(),
            'created_at' => $this->integer()->notNull(),
        ]);
    }

    public function safeDown()
    {
        $this->dropTable('user');
    }
}

Чтобы применить миграцию, запусти:

php yii migrate

Если нужно откатить последнюю миграцию, используй:

php yii migrate/down

Вот так просто. Ты можешь контролировать каждое изменение.

Основные методы для работы с таблицами и полями

Yii2 предоставляет кучу удобных методов, чтобы не писать сырой SQL. Вот самые популярные:

МетодОписаниеПример
createTableСоздаёт новую таблицу$this->createTable('post', [...])
addColumnДобавляет новый столбец$this->addColumn('post', 'title', $this->string())
dropColumnУдаляет столбец$this->dropColumn('post', 'title')
alterColumnИзменяет столбец$this->alterColumn('post', 'title', $this->string(255))
addForeignKeyДобавляет внешний ключ$this->addForeignKey('fk-post-user_id', 'post', 'user_id', 'user', 'id')
createIndexСоздаёт индекс$this->createIndex('idx-post-title', 'post', 'title')

Типы данных задаются через методы вроде string(), integer(), text(), boolean(). Можно добавлять параметры: notNull(), unique(), defaultValue(). Это сильно упрощает жизнь.

Продвинутые фишки: транзакции и пакетные миграции

Иногда одна миграция состоит из нескольких шагов. Например, нужно создать таблицу и сразу заполнить её данными. Если на втором шаге возникнет ошибка, первый шаг уже выполнен — данные могут быть частично изменены. Чтобы этого избежать, используй транзакции. Yii2 поддерживает их из коробки. Просто замени safeUp() и safeDown() на up() и down(), и оберни код в транзакцию:

public function up()
{
    $transaction = Yii::$app->db->beginTransaction();
    try {
        $this->createTable('log', [
            'id' => $this->primaryKey(),
            'message' => $this->text(),
        ]);
        $this->insert('log', ['message' => 'Table created']);
        $transaction->commit();
    } catch (Exception $e) {
        $transaction->rollBack();
        throw $e;
    }
}

Ещё одна полезная вещь — пакетные миграции. Если у тебя много изменений, можно объединить их в одну миграцию. Но я рекомендую делать одну миграцию на одно логическое изменение. Так проще откатывать и понимать историю.

Лайфхак: Перед запуском миграции на продакшене всегда делай бекап базы. Даже если ты уверен в коде. Лучше перебдеть, чем потом восстанавливать данные из дампа.

Как откатывать миграции и управлять историей

Yii2 хранит историю миграций в таблице migration. Когда ты запускаешь php yii migrate, система смотрит, какие миграции уже выполнены, и применяет только новые. Если нужно откатить все миграции до нуля, используй:

php yii migrate/down all

Но будь осторожен: это удалит все изменения, которые ты делал. Лучше откатывай по одной. Можно также откатить определённое количество шагов:

php yii migrate/down 3

Если нужно откатить конкретную миграцию, не обязательно идти по порядку. Yii2 позволяет использовать migrate/to с указанием версии. Например:

php yii migrate/to m250101_123456_create_user_table

Это откатит все миграции, которые были после указанной, и оставит её активной. Очень удобно, когда нужно быстро исправить ошибку.

Что в итоге?

Миграции в Yii2 — это твой главный инструмент для управления структурой базы данных. Они делают процесс предсказуемым, безопасным и командным. Ты можешь легко синхронизировать изменения между разработчиками, откатывать ошибки и не бояться потерять данные. Главное — не лениться и всегда создавать миграцию для любого изменения. И помни: бекап перед проделом — это не паранойя, а профессиональная привычка.

Студия WNDER