Миграции
Миграция — класс, который описывает одно изменение структуры базы данных и способ его отменить. Миграции хранятся вместе с кодом, поэтому база каждого разработчика и сервера приводится к одному виду одной командой.
Создание миграции
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_postpublic 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 считает её применённой и второй раз не запустит, а базы коллег и сервера останутся прежними. Для каждого изменения создавайте новую миграцию.