На 4-ом уроке по курсу Yii 2 мы разберём одну из тем для работы с базами данных, это миграции. Если вы раньше вручную меняли структуру БД или теряли данные при обновлении проекта, то этот урок станет для вас настоящим спасением. Мы научимся управлять изменениями в базе данных безопасно, эффективно и без головной боли.
Зачем нужны миграции?
Допустим, вы работаете над проектом в команде. Каждый разработчик добавляет новые таблицы или меняет типы полей. Без общего подхода это превратится в хаос. Кто-то забудет добавить столбец, другой не обновит индекс и вот уже проект не работает ни у кого.
Миграции решают эти проблемы. Они:
- Фиксируют изменения в коде. Каждая миграция это файл с инструкциями для БД.
- Обеспечивают консистентность. Все разработчики применяют одни и те же изменения.
- Позволяют откатывать ошибки. Если что-то пошло не так, вы можете вернуть базу в предыдущее состояние.
- Автоматизируют деплой. На сервере достаточно запустить команду, чтобы применить все изменения.
Миграции в Yii 2 это как система контроля версий (например Git), но для вашей базы данных.
Создание и применение миграций через консоль
В Yii 2 миграции создаются и применяются через консольные команды. Давайте разберёмся, как это работает.
1. Генерация миграции
Откройте терминал в корне проекта и выполните:
php yii migrate/create create_user_table
Эта команда создаст файл в папке console/migrations. Имя файла будет выглядеть так: m230901_120000_create_user_table.php (дата и время добавляются автоматически).
Структура файла миграции:
<?php
use yii\db\Migration;
class m230901_120000_create_user_table extends Migration
{
public function safeUp()
{
// Код для применения миграции
}
public function safeDown()
{
// Код для отката миграции
}
}
safeUp()операции при применении миграции (например, создание таблицы).safeDown()операции при откате (например, удаление таблицы).
2. Наполнение миграции
Допустим, мы хотим создать таблицу user с полями:
idпервичный ключ,usernameуникальное имя,emailэлектронная почта,created_atиupdated_atметки времени.
Модифицируем метод safeUp():
public function safeUp() { $this->createTable('user', [ 'id' => $this->primaryKey(), 'username' => $this->string(64)->notNull()->unique(), 'email' => $this->string(128)->notNull()->unique(), 'created_at' => $this->timestamp()->defaultExpression('CURRENT_TIMESTAMP'), 'updated_at' => $this->timestamp()->defaultExpression('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'), ]); }
В методе safeDown() пропишем откат:
public function safeDown() { $this->dropTable('user'); }
3. Применение миграции
Выполните в консоли:
php yii migrate
Yii применит все новые миграции и выведет список выполненных. После этого в вашей БД появится таблица user.
Как это работает?
Yii создаёт в базе служебную таблицу migration, где хранит названия применённых миграций. Это помогает отслеживать текущее состояние схемы БД.
Откат миграций
Ошиблись в миграции? Не беда! Yii позволяет откатить изменения.
1. Откат последней миграции
php yii migrate/down
Эта команда выполнит метод safeDown() из последней применённой миграции.
2. Откат нескольких миграций
Чтобы откатиться на N шагов, укажите число:
php yii migrate/down 3
3. Полный откат всех миграций
php yii migrate/fresh
Внимание! Эта команда удалит все таблицы, включая migration. Используйте только в разработке.
Пример: создание таблицы пользователей
Давайте закрепим материал на реальном примере. Предположим, нам нужно:
- Создать таблицу
user. - Добавить индекс для поля
email.
Шаг 1. Генерируем миграцию
php yii migrate/create add_user_table
Шаг 2. Редактируем метод safeUp()
public function safeUp() { $tableOptions = null; if ($this->db->driverName === 'mysql') { $tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB'; } $this->createTable('user', [ 'id' => $this->primaryKey(), 'username' => $this->string()->notNull()->unique(), 'email' => $this->string()->notNull()->unique(), 'password_hash' => $this->string()->notNull(), 'status' => $this->smallInteger()->notNull()->defaultValue(1), 'created_at' => $this->integer()->notNull(), 'updated_at' => $this->integer()->notNull(), ], $tableOptions); // Добавляем индекс для email $this->createIndex( 'idx-user-email', 'user', 'email' ); }
Шаг 3. Метод safeDown()
public function safeDown() { $this->dropIndex('idx-user-email', 'user'); $this->dropTable('user'); }
Шаг 4. Применяем миграцию
php yii migrate
Практические задачи
Чтобы лучше усвоить материал, выполните следующие задания:
Задача 1. Создание таблицы статей
Напишите миграцию для таблицы post с полями:
idпервичный ключ,titleзаголовок (не более 255 символов),contentтекст статьи,author_idвнешний ключ к таблицеuser,created_atдата создания.
Подсказка: для связи используйте $this->addForeignKey().
Задача 2. Добавление поля в таблицу
Предположим, в таблицу user нужно добавить поле phone (строка, 20 символов, уникальное). Создайте миграцию и примените её.
Решение:
public function safeUp() { $this->addColumn('user', 'phone', $this->string(20)->unique()); } public function safeDown() { $this->dropColumn('user', 'phone'); }
Задача 3. Откат миграции
Примените миграцию из Задачи 2, а затем откатите её. Убедитесь, что поле phone исчезло из таблицы.
Советы
- Всегда проверяйте миграции на тестовой базе перед применением в продакшене.
- Используйте метод
safeUp()вместоup(), чтобы миграция выполнялась в транзакции (если СУБД поддерживает). - Называйте миграции понятно:
create_user_table,add_column_phone_to_userи т.д.
Полный курс с уроками по Yii 2 для начинающих по ссылке: https://max-gabov.ru/yii-2-dlya-nachinaushih
Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.


