认识总是在不断进步的,其实事情远远没有这么复杂,我们只需要安装一个插件就够了:
composer require -dev --prefer-dist insolita/yii2-migration-generator:~2.3
然后你只需要访问Yii的gii
页面,就可以从原有的数据库里自动导出migrate文件了。不过以下方法依然有用,就是在你创建一个新的数据库表的时候。
关于Yii2的migrate使用的文章网上已有不少,但很多已经旧了,大量的还是教你如何编写代码,但实际上最新版Yii2的migrate可以尽量减少编写代码的工作,至少可以减少编写php代码而只通过命令行的方式就能达到目的。
我们直接分析以下命令行:
./yii migrate/create create_fac_item_table --fields="idfac_item:primaryKey,item_name:string(12):notNull,fac_id:integer:notNull:foreignKey(facility idfacility)"
虽然看上去很长,但是想清楚了写出来还是不难的。它分为这么几个部分:
./yii
,这是linux下的标准执行命令,没什么好说的。migrate/create
,前面migrate
这是Yii2里执行migrate的标准命令,后面create
是说明我们要创建一个新的migrate文件。create_fac_item_table
,这里create_xxx_table
是一个标准格式,就是说我们要创建的这个migrate文件要完成的任务是创建名称为xxx的数据库表,我这里要创建的表的名称是fac_item
,所以是这种格式。--fields=""
,引号里的内容详细说明了我们要创建的这张数据库表中的字段名称及类型等。下面详细说明:idfac_item:primaryKey
,这个地方的意思是说这个表的主键名称为idfac_item
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文件,如下:
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的官方文档。