认识总是在不断进步的,其实事情远远没有这么复杂,我们只需要安装一个插件就够了:

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)"

虽然看上去很长,但是想清楚了写出来还是不难的。它分为这么几个部分:

  1. ./yii,这是linux下的标准执行命令,没什么好说的。

  2. migrate/create,前面migrate这是Yii2里执行migrate的标准命令,后面create是说明我们要创建一个新的migrate文件。

  3. create_fac_item_table,这里create_xxx_table是一个标准格式,就是说我们要创建的这个migrate文件要完成的任务是创建名称为xxx的数据库表,我这里要创建的表的名称是fac_item,所以是这种格式。

  4. --fields="",引号里的内容详细说明了我们要创建的这张数据库表中的字段名称及类型等。下面详细说明:

  5. idfac_item:primaryKey,这个地方的意思是说这个表的主键名称为idfac_item

  6. item_name:string(12):notNull,这是第2个字段,它是一个string类型,长度为12,不允许为空

  7. fac_id:integer:notNull:foreignKey(facility idfacility),这是第3个字段,它是一个数字型,非空,并且还有一个外键,连接到一个名称为facility的数据库表,连接的主键名称为idfacility,中间以空格区格。

全部写好之后回车,它会问你是否要执行,如下:

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检查数据库,发现表已成功建立:

clipboard.png

外键也是正确的:

clipboard.png

我这里举的例子只是创建数据库表,其它比如删除数据库表,添加字段,删除字段等工作都可以用这种命令行的方式完成,具体就不细讲了,大家可以去参考Yii2的官方文档


张京
13.4k 声望4.7k 粉丝

现任北京联云天下科技有限公司技术副总裁。1994年毕业于清华大学计算机科学与技术专业;20多年软件开发及项目管理经验;历任亚洲生活网络公司CTO,摩托罗拉软件中心QSE工具经理,融信恒通技术总监,安必信软件公...