Для создания миграций в yii2 используется команда php yii migrate/create ...
. Такая команда создаст в папке migrations файл миграции с 2 пустыми методами: up и down. Однако, в генератор миграций встроены несколько шаблонов, которые упрощают создание миграций. Рассмотрим их:
- Создание таблицы базы данных
Формат команды: php yii migrate/create create_post_table
- создаст таблицу post
Дополнительный код в миграции:
public function safeUp()
{
$this->createTable('{{%post}}', [
'id' => $this->primaryKey(),
]);
}
public function safeDown()
{
$this->dropTable('{{%post}}');
}
- Удаление таблицы базы данных
Формат команды: php yii migrate/create drop_post_table
Дополнительный код в миграции:
public function safeUp()
{
$this->dropTable('{{%post}}');
}
public function safeDown()
{
$this->createTable('{{%post}}', [
'id' => $this->primaryKey(),
]);
}
- Добавление столбца в таблицу
Формат команды: php yii migrate/create add_title_column_to_post_table --fields=title
Дополнительный код в миграции:
public function safeUp()
{
$this->addColumn('{{%post}}', 'title', $this->);
}
public function safeDown()
{
$this->dropColumn('{{%post}}', 'title');
}
- Удаление столбца из таблицы
Формат команды: php yii migrate/create drop_title_column_from_post_table --fields=title
Дополнительный код в миграции:
public function safeUp()
{
$this->dropColumn('{{%post}}', 'title');
}
public function safeDown()
{
$this->addColumn('{{%post}}', 'title', $this->);
}
- Добавление промежуточной таблицы
Формат команды: php yii migrate/create create_junction_table_for_post_and_user_tables
Дополнительный код в миграции:
public function safeUp()
{
$this->createTable('{{%post_user}}', [
'post_id' => $this->integer(),
'user_id' => $this->integer(),
'PRIMARY KEY(post_id, user_id)',
]);
// creates index for column `post_id`
$this->createIndex(
'{{%idx-post_user-post_id}}',
'{{%post_user}}',
'post_id'
);
// add foreign key for table `{{%post}}`
$this->addForeignKey(
'{{%fk-post_user-post_id}}',
'{{%post_user}}',
'post_id',
'{{%post}}',
'id',
'CASCADE'
);
// creates index for column `user_id`
$this->createIndex(
'{{%idx-post_user-user_id}}',
'{{%post_user}}',
'user_id'
);
// add foreign key for table `{{%user}}`
$this->addForeignKey(
'{{%fk-post_user-user_id}}',
'{{%post_user}}',
'user_id',
'{{%user}}',
'id',
'CASCADE'
);
}
/**
* {@inheritdoc}
*/
public function safeDown()
{
// drops foreign key for table `{{%post}}`
$this->dropForeignKey(
'{{%fk-post_user-post_id}}',
'{{%post_user}}'
);
// drops index for column `post_id`
$this->dropIndex(
'{{%idx-post_user-post_id}}',
'{{%post_user}}'
);
// drops foreign key for table `{{%user}}`
$this->dropForeignKey(
'{{%fk-post_user-user_id}}',
'{{%post_user}}'
);
// drops index for column `user_id`
$this->dropIndex(
'{{%idx-post_user-user_id}}',
'{{%post_user}}'
);
$this->dropTable('{{%post_user}}');
}
Стоит учитывать, что при использовании пространства имен в миграциях, шаблоны для создания дополнительного кода не работают. Решение состоит либо в переопределении метода actionCreate
контроллера yii\console\controllers\MigrateController
, либо в использовании отдельностоящих миграций (см. подробнее )
{{ 'Comments (%count%)' | trans {count:count} }}
{{ 'Comments are closed.' | trans }}