遇见Laravel Migrations的migrate与rollback

来源:互联网 发布:淘宝店铺查询 编辑:程序博客网 时间:2024/06/15 00:38


之前创建项目的时候使用了artisan指令直接生成了数据库的Migrations.

但是随着项目模块的逐渐增加,出现了需要增加字段的情况,在结合手册折腾了大概一小时之后,终于把现在遇到的问题都整理出来了,也正好给自己留一个记录.


一.生成migration

通过手册可以看到,通过artisan来直接生成非常的方便.

php artisan make:migration name [--option]  

其中name是migration文件的文件名,生成文件后会自动在输入的文件名前添加data('Y_m_d_Hms_') . name的形式.

如当天时间为2017年10月17日23:03:23,name为user的话,文件名即为2017_10_17_230323_user.

打开文件后,内容如下:

class User extends Migration{    /**     * Run the migrations.     *     * @return void     */    public function up()    {        //    }    /**     * Reverse the migrations.     *     * @return void     */    public function down()    {        //    }}
这里是第一个需要注意的地方,如果在创建migration时,name如果是user_aa_bb_cc的情况,生成文件中类文件名会变成Useraabbcc.


二.执行migrate

执行指令:

php artisan migrate
这时数据库中已经有你在类中up()方法里创建的一些字段内容了.

同时会生成一张名为migrations的表.其中的两个字段分别记录了migrate的文件名的批次(batch).

每migrate一次,新文件名的batch的值就会+1.

用来记录我们一共分批执行了多少次.

我们来模拟一下:

public function up()    {        //        Schema::create('user', function (Blueprint $table) {            $table->increments('id');            $table->string('user_name', 30)->unique();            $table->string('e_mail',50)->unique();            $table->string('pass_word');            $table->tinyInteger('access');        });    }
这时表中应该会有相应的字段了.

同样,我们还要在down()方法中填写一些内容:

因为这时第一次migrate,所以down()选择删除该表.

public function down()    {        //        Schema::dropIfExists('user');    }
个人观点:虽然这么做比较符合逻辑,但是这样会出现问题,如果rollback误操作多了一次操作或出现了step[=step]次数错误,直接摧毁了数据表,是十分危险的.

如果真的rollback到了最初的表状态,也可以通过手动删除表的方式,这样的话可控性会高一些.

三.执行添加新的migration

在项目中,经常会遇到表增加字段的情况,这时候就需要添加新的migration了.

这里是第二个注意点:

虽然每次通过make:migration指令创建的文件都会有时间前缀,但是这部分内容实际上是让Laravel判断时间顺序的,不会被写入类名.

同时,如果第二次make:migration创建文件时,name不能与之前的name相同,不然会类名冲突出现致命错误.

个人习惯是在文件后增加今天的日期,可能在后续的工作中还会有更规范的写法.

那么下面我们进行第二次make:migration,示例如下:

php artisan make:migration user_2017_10_17

class User20171017 extends Migration{    /**     * Run the migrations.     *     * @return void     */    public function up()    {        //修改用户表的字段名称        Schema::table('user', function (Blueprint $table) {            $table->renameColumn('user_name', 'username');            $table->renameColumn('e_mail', 'email');            $table->renameColumn('pass_word', 'password');            $table->timestamps();        });    }    /**     * Reverse the migrations.     *     * @return void     */    public function down()    {        //退回上次修改        Schema::table('user', function (Blueprint $table) {            $table->renameColumn('username', 'user_name');            $table->renameColumn('email', 'e_mail');            $table->renameColumn('password', 'pass_word');            $table->dropTimestamps();        });    }}

这里我修改了一些字段的名称,增加了时间字段.

在down()方法中,按照相反的方式添加相应的方法即可.

四.migrate:rollback

就如开始所说,我们有的时候在migrate过程中出现了一些小错误,需要执行migrate:rollback指令:

php artisan migrate:rollback --step[=step]
其中可选参数step为rollback的步数.

这时,系统会根据之前migrations表中的batch字段,逐次的进行rollback,每执行一次rollback,就相当于是回退到了上一次migrate的地方.



这就是我整个实现migrations过程,其中大部分程手册中都有,我只是把我觉得比较重要的部分记录了下来.

同时我在整个过程中遇到的问题主要是第二次执行make:migrations时,与之前的文件名字重复,导致出现了重名类.

后来通过上面需要注意的点解决了这个问题.

本人刚刚接触这些东西也没多久,如果有错误的地方,还希望提出宝贵意见.

今天就先到这里,谢谢!