andy87 / yii2-migrate-architect
PHP library for Yii2 - developed by and_y87
Requires
- php: >=8.0
- yiisoft/yii2: *
This package is auto-updated.
Last update: 2024-12-07 12:08:14 UTC
README
Yii2 migrate architect - библиотека для фреймворка Yii2 упрощающая написание кода миграций.
Цель: сделать простой и быстрый инструмент добавления миграций.
Содержание:
Установка
Требования
- php >=8.0
- Yii2
Composer
Добавление пакета в проект
Используя: консольные команды. (Предпочтительней)
- используя composer, установленный локально
composer require andy87/yii2-migrate-architect
- используя composer.phar
php composer.phar require andy87/yii2-migrate-architect
Далее: обновление зависимостей composer install
Используя: файл `composer.json`
Открыть файл 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, // ... ], // ... ];
Пример с кастомизацией:
- directoryTemplateMigrations путь к шаблонам миграций
- migrateTemplateMapping маппинг шаблонов миграций
- snippetsMigrationFilename шаблоны имён файлов миграции
- migrationPath (массив)путь к директории в которую будет сгенерирована миграция
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', //,,, ], 'migrationPath' => ['@console/migration'] ], // ... ], // ... ];
Использование
Консольная команда:
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.
Простые примеры миграций
CreateTable.
Создание таблицы
Колонки: 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, ]; } }
UpdateTable.
Добавление колонки
Для добавления колонки, необходимо переопределить метод 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'], ]; }