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


