Урок 4: Миграции баз данных в Yii 2

На 4-ом уроке по курсу Yii 2 мы разберём одну из тем для работы с базами данных, это миграции. Если вы раньше вручную меняли структуру БД или теряли данные при обновлении проекта, то этот урок станет для вас настоящим спасением. Мы научимся управлять изменениями в базе данных безопасно, эффективно и без головной боли.

Зачем нужны миграции?

Допустим, вы работаете над проектом в команде. Каждый разработчик добавляет новые таблицы или меняет типы полей. Без общего подхода это превратится в хаос. Кто-то забудет добавить столбец, другой не обновит индекс и вот уже проект не работает ни у кого.

Миграции решают эти проблемы. Они:

  1. Фиксируют изменения в коде. Каждая миграция это файл с инструкциями для БД.
  2. Обеспечивают консистентность. Все разработчики применяют одни и те же изменения.
  3. Позволяют откатывать ошибки. Если что-то пошло не так, вы можете вернуть базу в предыдущее состояние.
  4. Автоматизируют деплой. На сервере достаточно запустить команду, чтобы применить все изменения.

Миграции в Yii 2 это как система контроля версий (например Git), но для вашей базы данных.

Создание и применение миграций через консоль

В Yii 2 миграции создаются и применяются через консольные команды. Давайте разберёмся, как это работает.

1. Генерация миграции

Откройте терминал в корне проекта и выполните:

bash
php yii migrate/create create_user_table

Эта команда создаст файл в папке console/migrations. Имя файла будет выглядеть так: m230901_120000_create_user_table.php (дата и время добавляются автоматически).

Структура файла миграции:

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():

php
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() пропишем откат:

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

3. Применение миграции

Выполните в консоли:

bash
php yii migrate

Yii применит все новые миграции и выведет список выполненных. После этого в вашей БД появится таблица user.

Как это работает?

Yii создаёт в базе служебную таблицу migration, где хранит названия применённых миграций. Это помогает отслеживать текущее состояние схемы БД.

Откат миграций

Ошиблись в миграции? Не беда! Yii позволяет откатить изменения.

1. Откат последней миграции

bash
php yii migrate/down

Эта команда выполнит метод safeDown() из последней применённой миграции.

2. Откат нескольких миграций

Чтобы откатиться на N шагов, укажите число:

bash
php yii migrate/down 3

3. Полный откат всех миграций

bash
php yii migrate/fresh

Внимание! Эта команда удалит все таблицы, включая migration. Используйте только в разработке.

Пример: создание таблицы пользователей

Давайте закрепим материал на реальном примере. Предположим, нам нужно:

  1. Создать таблицу user.
  2. Добавить индекс для поля email.

Шаг 1. Генерируем миграцию

bash
php yii migrate/create add_user_table

Шаг 2. Редактируем метод safeUp()

php
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()

php
public function safeDown()
{
    $this->dropIndex('idx-user-email', 'user');
    $this->dropTable('user');
}

Шаг 4. Применяем миграцию

bash
php yii migrate

Практические задачи

Чтобы лучше усвоить материал, выполните следующие задания:

Задача 1. Создание таблицы статей

Напишите миграцию для таблицы post с полями:

  • id первичный ключ,
  • title заголовок (не более 255 символов),
  • content текст статьи,
  • author_id внешний ключ к таблице user,
  • created_at дата создания.

Подсказка: для связи используйте $this->addForeignKey().

Задача 2. Добавление поля в таблицу

Предположим, в таблицу user нужно добавить поле phone (строка, 20 символов, уникальное). Создайте миграцию и примените её.

Решение:

php
public function safeUp()
{
    $this->addColumn('user', 'phone', $this->string(20)->unique());
}

public function safeDown()
{
    $this->dropColumn('user', 'phone');
}

Задача 3. Откат миграции

Примените миграцию из Задачи 2, а затем откатите её. Убедитесь, что поле phone исчезло из таблицы.

Советы

  1. Всегда проверяйте миграции на тестовой базе перед применением в продакшене.
  2. Используйте метод safeUp() вместо up(), чтобы миграция выполнялась в транзакции (если СУБД поддерживает).
  3. Называйте миграции понятно: create_user_tableadd_column_phone_to_user и т.д.

Полный курс с уроками по Yii 2 для начинающих по ссылке: https://max-gabov.ru/yii-2-dlya-nachinaushih

Поделиться статьей:
Поддержать автора блога

Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.

Персональные рекомендации
Оставить комментарий