当前位置: 首页 > 后端技术 > PHP

Yii2的非编程迁移示例

时间:2023-03-29 19:33:23 PHP

理解一直在进步。事实上,事情远没有这么复杂。我们只需要安装一个插件:composerrequire-dev--prefer-distinsolita/yii2-migration-generator:~2.3那么你只需要访问Yii的gii页面,migrate文件就可以自动导出了原始数据库。不过下面的方法还是有用的,就是当你新建一个数据库表的时候。网上关于Yii2的migrate的使用的文章很多,但是很多都比较老了,还有大量还在教大家怎么写代码,但其实最新版的Yii2的migrate可以最大程度的减少工作量写代码,至少可以减少php代码的编写,但是只有通过命令行才能达到目的。我们直接分析如下命令行:./yiimigrate/createcreate_fac_item_table--fields="idfac_item:primaryKey,item_name:string(12):notNull,fac_id:integer:notNull:foreignKey(facilityidfacility)"虽然看起来很长,不过想清楚了也不难写出来。分为几个部分:./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_itemitem_name:string(12):notNull,这是第二个字段,是string类型,长度是12,不是允许为空fac_id:integer:notNull:foreignKey(facilityidfacility),这是第三个字段,是一个数字,非空,还有一个外键,连接到一个名为facility的数据库表,主键连接的名称是idfacility,以空格分隔。全部写好后回车,会问你是否要执行,如下:YiiMigrationTool(basedonYiiv2.0.12-dev)Createnewmigration'/Library/WebServer/Documents/project/console/migrations/m170602_002220_create_fac_item_table.php'?(yes|no)[no]:yesNew迁移创建成功。它会在console/migrations下自动生成一个新的.php文件,如下:'=>$this->primaryKey(),'item_name'=>$this->string(12)->notNull(),'fac_id'=>$this->integer()->notNull(),]);//为列`fac_id`创建索引$this->createIndex('idx-fac_item-fac_id','fac_item','fac_id');//为表`facility`添加外键$this->addForeignKey('fk-fac_item-fac_id','fac_item','fac_id','设施','idfacility','CASCADE');}publicfunctiondown(){//删除表`facility`的外键$this->dropForeignKey('fk-fac_item-fac_id','fac_item');//删除列`fac_id`的索引$this->dropIndex('idx-fac_item-fac_id','fac_item');$this->dropTable('fac_item');}}up和down的作用就不详细解释了,官方文档有详细解释,大意是up向上执行,down给你留有遗憾的余地默认情况下,你的console/migrations目录下应该还有另一个用户表创建文件,所以如果你现在执行./yiimigrate,它会询问你是否要执行所有操作:YiiMigrationTool(basedonYiiv2.0.12-dev)Total2newmigrationstobeapplied:m130524_201442_initm170602_002220_create_fac_item_tableApplytheabovemigrations?(yes|no)[no]:no在这里,我们选择no,因为我们的数据库表中已经有user了,不用重新创建,我们需要标记一下,以免以后再问我们这个问题:./yiimigrate/markm130524_201442_init然后执行./yiimigrateYiiMigrationTool(basedonYiiv2.0.12-dev)Total1newmigrationstobeapplyed:m170602_002220_create_fac_item_tableApplytheabovemigrations?(yes|no)[no]:yes***applyingm170602_002220_create_fac_item_table>createtablefac_item...done(time:0.555s)>create-facite_idfac_item(fac_id)...done(time:0.649s)>添加外来keyfk-fac_item-fac_id:fac_item(fac_id)referencesfacility(idfacility)...done(time:0.529s)***appliedm170602_002220_create_fac_item_table(time:1.986s)1迁移已应用d.迁移成功。用mysqlworkbench查看数据库,发现建表成功:外键也正确:我这里举的例子只是创建一个数据库表,其他任务如删除数据库表,添加字段,删除字段等可以用这个命令行方式完成,就不赘述了。可以参考Yii2的官方文档