andy87 / yii2-migrate-architect
PHP 库用于 Yii2 - 由 and_y87 开发
0.0.1
2024-06-28 07:27 UTC
Requires
- php: >=8.0
- yiisoft/yii2: *
This package is auto-updated.
Last update: 2024-09-12 06:25:55 UTC
README
Yii2 迁移架构师 - 用于简化编写代码迁移的 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 迁移文件名模板
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.
简单迁移示例
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'], ]; }