Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Миграции

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

Создание миграции

php yii migrate/create create_post_table

Команда спросит подтверждение и создаст файл в папке migrations. В его имени — дата и время, они задают порядок выполнения. По словам create_..._table Yii сам подготовит заготовку таблицы. Допишите в неё столбцы:

// migrations/m260302_101500_create_post_table.php
use yii\db\Migration;
 
class m260302_101500_create_post_table extends Migration
{
    public function safeUp()
    {
        $this->createTable('post', [
            'id' => $this->primaryKey(),
            'user_id' => $this->integer()->notNull(),
            'title' => $this->string(255)->notNull(),
            'body' => $this->text()->notNull(),
            'status' => $this->smallInteger()->notNull()->defaultValue(0),
            'created_at' => $this->integer()->notNull(),
            'updated_at' => $this->integer()->notNull(),
        ]);
    }
 
    public function safeDown()
    {
        $this->dropTable('post');
    }
}

safeUp() вносит изменение, safeDown() отменяет его. В столбцах created_at и updated_at будет храниться время в виде числа секунд — так принято в Yii.

Выполнение

php yii migrate

Команда покажет список новых миграций, спросит подтверждение и создаст таблицу post. Выполненные миграции запоминаются в таблице migration, поэтому повторный запуск ничего не сделает.

Типы столбцов

МетодТип
primaryKey()Целое число с автоувеличением, первичный ключ
string(255)Строка
text()Длинный текст
integer(), smallInteger(), bigInteger()Целые числа
decimal(10, 2)Точное дробное число, например цена
boolean()Да или нет
dateTime(), date()Дата со временем, дата

К типу добавляют уточнения: notNull() запрещает пустое значение, defaultValue(0) задаёт значение по умолчанию, unique() запрещает повторы.

Откат

php yii migrate/down
php yii migrate/down 3
php yii migrate/history

Первая команда отменяет последнюю миграцию, вторая — три последние, третья показывает список выполненных.

Изменение таблицы

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

php yii migrate/create add_slug_to_post
public function safeUp()
{
    $this->addColumn('post', 'slug', $this->string(255)->notNull()->defaultValue(''));
    $this->createIndex('idx-post-slug', 'post', 'slug');
}
 
public function safeDown()
{
    $this->dropIndex('idx-post-slug', 'post');
    $this->dropColumn('post', 'slug');
}

После php yii migrate в таблице появится столбец slug с индексом — он ускоряет поиск по этому столбцу.

Внешний ключ

Внешний ключ не даёт сохранить статью с несуществующим автором:

$this->addForeignKey('fk-post-user_id', 'post', 'user_id', 'user', 'id', 'CASCADE');

Аргументы: имя ключа, таблица и её столбец, связанная таблица и её столбец, действие при удалении. CASCADE означает, что вместе с пользователем удалятся его статьи.

Частая ошибка

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

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.