认识老是在不断进步的,其实事情远远没有这么复杂,咱们只须要安装一个插件就够了:php
composer require -dev --prefer-dist insolita/yii2-migration-generator:~2.3
而后你只须要访问Yii的gii
页面,就能够从原有的数据库里自动导出migrate文件了。不过如下方法依然有用,就是在你建立一个新的数据库表的时候。html
关于Yii2的migrate使用的文章网上已有很多,但不少已经旧了,大量的仍是教你如何编写代码,但实际上最新版Yii2的migrate能够尽可能减小编写代码的工做,至少能够减小编写php代码而只经过命令行的方式就能达到目的。mysql
咱们直接分析如下命令行:linux
./yii migrate/create create_fac_item_table --fields="idfac_item:primaryKey,item_name:string(12):notNull,fac_id:integer:notNull:foreignKey(facility idfacility)"
虽然看上去很长,可是想清楚了写出来仍是不难的。它分为这么几个部分:sql
./yii
,这是linux下的标准执行命令,没什么好说的。数据库
migrate/create
,前面migrate
这是Yii2里执行migrate的标准命令,后面create
是说明咱们要建立一个新的migrate文件。yii2
create_fac_item_table
,这里create_xxx_table
是一个标准格式,就是说咱们要建立的这个migrate文件要完成的任务是建立名称为xxx的数据库表,我这里要建立的表的名称是fac_item
,因此是这种格式。app
--fields=""
,引号里的内容详细说明了咱们要建立的这张数据库表中的字段名称及类型等。下面详细说明:composer
idfac_item:primaryKey
,这个地方的意思是说这个表的主键名称为idfac_item
yii
item_name:string(12):notNull
,这是第2个字段,它是一个string
类型,长度为12
,不容许为空
fac_id:integer:notNull:foreignKey(facility idfacility)
,这是第3个字段,它是一个数字型,非空,而且还有一个外键,链接到一个名称为facility
的数据库表,链接的主键名称为idfacilit
y,中间以空格区格。
所有写好以后回车,它会问你是否要执行,以下:
Yii Migration Tool (based on Yii v2.0.12-dev) Create new migration '/Library/WebServer/Documents/project/console/migrations/m170602_002220_create_fac_item_table.php'? (yes|no) [no]:yes New migration created successfully.
它会自动在console/migrations
下生成一个新的.php文件,以下:
<?php use yii\db\Migration; class m170602_002220_create_fac_item_table extends Migration { public function up() { $this->createTable('fac_item', [ 'idfac_item' => $this->primaryKey(), 'item_name' => $this->string(12)->notNull(), 'fac_id' => $this->integer()->notNull(), ]); // creates index for column `fac_id` $this->createIndex( 'idx-fac_item-fac_id', 'fac_item', 'fac_id' ); // add foreign key for table `facility` $this->addForeignKey( 'fk-fac_item-fac_id', 'fac_item', 'fac_id', 'facility', 'idfacility', 'CASCADE' ); } public function down() { // drops foreign key for table `facility` $this->dropForeignKey( 'fk-fac_item-fac_id', 'fac_item' ); // drops index for column `fac_id` $this->dropIndex( 'idx-fac_item-fac_id', 'fac_item' ); $this->dropTable('fac_item'); } }
up和down的做用就不详细解释了,官方文档有详细解释,大意是说up是向上执行,down让你有个后悔的余地。
缺省状况下,你的console/migrations
目录下应该还有另一个关于user表的建立文件,因此若是你如今就执行./yii migrate
的话,它会问你是否要执行全部的操做:
Yii Migration Tool (based on Yii v2.0.12-dev) Total 2 new migrations to be applied: m130524_201442_init m170602_002220_create_fac_item_table Apply the above migrations? (yes|no) [no]:no
在这里,咱们选择no
,由于咱们数据库里已经有user
这张表了,不须要再建立一遍,咱们须要标记一下,免得它之后老问咱们这个问题:
./yii migrate/mark m130524_201442_init
而后再执行./yii migrate
Yii Migration Tool (based on Yii v2.0.12-dev) Total 1 new migrations to be applied: m170602_002220_create_fac_item_table Apply the above migrations? (yes|no) [no]:yes *** applying m170602_002220_create_fac_item_table > create table fac_item ... done (time: 0.555s) > create index idx-fac_item-fac_id on fac_item (fac_id) ... done (time: 0.649s) > add foreign key fk-fac_item-fac_id: fac_item (fac_id) references facility (idfacility) ... done (time: 0.529s) *** applied m170602_002220_create_fac_item_table (time: 1.986s) 1 migration were applied. Migrated up successfully.
用mysql workbench检查数据库,发现表已成功创建:
外键也是正确的:
我这里举的例子只是建立数据库表,其它好比删除数据库表,添加字段,删除字段等工做均可以用这种命令行的方式完成,具体就不细讲了,你们能够去参考Yii2的官方文档。