Yii2 migrate architect - библиотека для фреймворка Yii2 упрощающая написание кода миграций.
Цель: сделать простой и быстрый инструмент добавления миграций.
composer require andy87/yii2-migrate-architect
php composer.phar require andy87/yii2-migrate-architect
Далее: обновление зависимостей composer install
Открыть файл composer.json
В раздел, ключ require
добавить строку
"andy87/yii2-migrate-architect": "*"
Далее: обновление зависимостей composer install
В конфигурационном файле config/console.php
добавить контроллер:
andy87\yii2\architect\components\controllers\ArchitectController
use andy87\yii2\architect\components\controllers\ArchitectController;
return [
// ...
'controllerMap' => [
// ...
'architect' => ArchitectController::class,
// ...
],
// ...
];
Пример с кастомизацией:
use andy87\yii2\architect\components\controllers\ArchitectController;
return [
// ...
'controllerMap' => [
// ...
'architect' => [
'class' => ArchitectController::class,
'directoryTemplateMigrations' => '@app/path/to/migrations/template/',
'migrateTemplateMapping' => [
ArchitectController::SCENARIO_COLUMN_ADD => 'create_table_template',
ArchitectController::SCENARIO_UPDATE => 'update_table_template',
//,,,
],
'snippetsMigrationFilename' => [
ArchitectController::SCENARIO_COLUMN_ADD => 'create_table__%s',
ArchitectController::SCENARIO_UPDATE => 'update_table__%s',
//,,,
]
],
// ...
],
// ...
];
Консольная команда:
php yii architect
Запускает интерактивное меню для:
andy87\yii2\architect\CreateTable
andy87\yii2\architect\UpdateTable
> php yii architect
Yii Migration Tool (based on Yii v2.0.51-dev)
Select action:
1. Create migration
2. Apply migrations
3. Down migrations
4. Run migrations
0. Exit
--------------------
variant: 2
`Create migration`:
1. Create table
2. Update column
3. Add column
4. Rename column
5. Remove column
0. Exit
--------------------
action: 1
Table name: product
Create new migration '../console/migrations\m240628_072029_create_table__product.php'? (yes|no) [no]:y
New migration created successfully.
Колонки: id
, created_at
, updated_at
создадутся автоматически
<?php
use andy87\yii2\architect\CreateTable;
/**
* Class m240626_210742_create_table__role
*/
class m240626_210742_create_table__role extends CreateTable
{
public string $scenario = self::SCENARIO_CREATE;
/** @var string Название таблицы */
public string $tableName = '{{%role}}';
/**
* @var array Список для генерации внешних ключей.
* Для примера добавлены два внешних ключа.
*/
public array $foreignKeyList = [
'module' => 'id', // fk--role-module_id--module-id
'sub_module_id' => ['module' => 'id'], // fk--role-sub_module_id--module-id
];
/**
* @return array
*/
public function columns(): array
{
return [
'status' => $this->smallInteger()->notNull()->defaultValue(10),
'key' => $this->string(32)->notNull()->unique(),
'name' => $this->string(64)->notNull()->unique(),
'priority' => $this->integer(4)->defaultValue(1),
'module_id' => $this->integer(4)->notNull(),
'sub_module_id' => $this->integer(4)->notNull(),
];
}
}
Отмена создания колонок, происходит через назначение значения false
или null
для колонки.
Для примера: id
, updated_at
не будут созданы
<?php
use andy87\yii2\architect\CreateTable;
/**
* Class m240626_210741_create_table__log
*/
class m240626_210741_create_table__log extends CreateTable
{
public string $scenario = self::SCENARIO_CREATE;
/** @var string Название таблицы */
public string $tableName = 'log';
/**
* @return array
*/
public function columns(): array
{
return [
self::COLUMN_ID => false,
'text' => $this->string(32)->notNull()->unique(),
self::COLUMN_UPDATED_AT => null,
];
}
}
Для добавления колонки, необходимо переопределить метод columnsListAdd
, вернув массив с описанием колонок.
<?php
use andy87\yii2\architect\UpdateTable;
/**
* Class m240626_210729_update_table__user
*/
class m240626_210729_update_table__user extends UpdateTable
{
public string $scenario = self::SCENARIO_COLUMN_ADD;
/** @var string Название таблицы */
public string $tableName = 'user';
/**
* Список колонок для добавления
*
* @return array
*/
public function columnsListAdd(): array
{
return [
'verification_token' => $this->string()->defaultValue(null)
];
}
}
Для добавления колонок и внешних ключей, необходимо переопределить методы columnsListAdd
и foreignKeyList
, вернув массивы с описанием колонок и внешних ключей.
<?php
use andy87\yii2\architect\UpdateTable;
/**
* Class m240626_210728_update_table__category
*/
class m240626_210728_update_table__category extends UpdateTable
{
public string $scenario = self::SCENARIO_COLUMN_ADD;
/** @var string Название таблицы */
protected string $tableName = 'category';
/** @var array Мэппинг внешних ключей */
protected array $foreignKeyList = [
'user' => 'id', // fk--category-user_id--user-id
'author_id' => ['user' => 'id'], // fk--category-author_id--user-id
'parent_id' => ['category' => 'id'], // fk--category-parent_id--category-id
];
/**
* Список колонок для добавления
*
* @return array
*/
public function columnsListAdd(): array
{
return [
'user_id' => $this->integer(8)->notNull(),
'author_id' => $this->integer(8)->notNull()->after('user_id'),
'parent_id' => $this->integer(8)->null()->after('id'),
];
}
}
Для редактирования колонки, необходимо переопределить метод columnsListUpdate
, вернув массив с описанием колонок.
<?php
use andy87\yii2\architect\UpdateTable;
use app\common\models\sources\Role;
/**
* Class m240626_210729_update_table__user
*/
class m240626_210729_update_table__user extends UpdateTable
{
public string $scenario = self::SCENARIO_UPDATE;
/** @var string Название таблицы */
protected string $tableName = 'user';
/**
* Список колонок для изменения
*
* @return array
*/
public function columnsListUpdate(): array
{
return [
'auth_key' => $this->string(64)->notNull()->unique(),
'author_id' => $this->integer(4)->notNull()->unique(),
];
}
}
Для переименования колонки, необходимо переопределить свойство renameColumnList
, вернув массив с мэппингом старых и новых названий колонок.
<?php
use app\common\models\sources\Role;
use andy87\yii2\architect\UpdateTable;
/**
* Class m240626_210725_update_table__product
*/
class m240626_210725_update_table__product extends UpdateTable
{
public string $scenario = self::SCENARIO_COLUMN_RENAME;
/** @var string Название таблицы */
protected string $tableName = 'product';
/** @var array Список колонок для переименования */
protected array $renameColumnList = [
'old_price' => 'price',
'new_price' => 'price_new',
];
}
Для удаления колонок, необходимо переопределить свойство removeColumnList
, вернув массив с названиями колонок для удаления в ключе, а в значении массив указывающий на связи через внешние ключи.
<?php
use app\common\models\sources\Role;
use andy87\yii2\architect\UpdateTable;
/**
* Class m240626_210735_update_table__service
*/
class m240626_210735_update_table__service extends UpdateTable
{
public string $scenario = self::SCENARIO_COLUMN_REMOVE;
/** @var string Название таблицы */
protected string $tableName = 'service';
/** @var array Список колонок для удаления */
protected array $removeColumnList = [
'comments' => null,
'property' => null,
'user_id' => ['user' => 'id'],
];
}