迁移是一种数据库的版本控制。可以让团队在修改数据库结构的同时,保持彼此的进度一致。它是 Laravel 5
最强大的功能之一。
一般我们可以通过phpmyadmin
或者Navicat
等数据库管理工具来创建、修改数据表结构。如果就自己一个人的话还好,但是如果团队中有多个人,我们就需要导出表结构,然后传给团队中其他人,他们再把数据表结构导入他们的数据库,这时如果表中原来有数据的话就可能出现一些问题。而Laravel 5中的Migrations
很好的避免了此问题。
Migrations把表结构存储为一个PHP类,通过调用其中的方法来创建、更改数据库。Migrations存放在在 database/migrations 目录中。初始情况下,其中包含了两个文件:**_create_users_table.php 和_create_password_resets_table.php**,分别是用户表和用户密码重置表。每个文件中都包含了 up() 和 down() 两个方法,一个用来创建、更改数据表,一个用来回滚操作,即撤 up() 中的操作。
创建迁移文件
使用 Artisan CLI
的 make:migrate
命令建立迁移文件:
1 | D:\wamp\www\laravel5>php artisan help make:migration |
其中 –create
是创建一个新表,而 –table
为修改指定表。如:
1 | php artisan make:migration create_users_table --create=users //创建users表 |
生成的迁移文件默认存放在 database/migrations
目录中,文件名会包含时间戳记,在执行迁移时用来决定顺序。
执行数据迁移
执行所有未执行的迁移
1 | php artisan migrate |
注意: 如果在执行迁移时发生「class not found」
错误,试着先执行 composer dump-autoload
命令后再进行一次。
在线上环境 (Production)
中强制执行迁移
有些迁移操作是具有破坏性的,意味着可能让你遗失原本保存的数据。为了防止你在上线环境执行到这些迁移命令,你会被提示要在执行迁移前进行确认。加上 --force
参数执行强制迁移:
1 | php artisan migrate --force |
回滚迁移
回滚上一次的迁移
1 | php artisan migrate:rollback |
回滚所有迁移
1 | php artisan migrate:reset |
回滚所有迁移并且再执行一次
1 | php artisan migrate:refresh |
上面是一些数据迁移的基本操作,下面是一个例子:
执行数据迁移:
1 | D:\wamp\www\laravel5>php artisan migrate |
此时查看数据库,会发现多出了migrations
、password_resets
、users
三个表,migrations
表是用来管理数据库迁移回滚等操作的,一般不要动这个表,而users
表和password_resets
表就是 database/migrations
目录原有的两个生成的表。
想修改users
表中的name
字段为username
,执行回滚操作:
1 | D:\wamp\www\laravel5>php artisan migrate:rollback |
再次查看数据库,发现users
表和password_resets
表已经被删除。修改 ***_create_users_table.php
文件,把name
修改为username
,之后再次支持数据库迁移。查看数据库users
表,发现字段名已经变成了username
。
新建articles迁移
创建一个存放博客的数据表:
1 | D:\wamp\www\laravel5>php artisan make:migration create_articles_table --create=articles |
此时, database/migrations
目录中会多出一个***_create_articles_table.php
文件:
1 |
|
up()
方法中创建了一个自增ID,其中的 timestamps()
方法会生成 created_at
和 updated_at
两个时间列。下面向其中增加一些列:
1 | public function up() |
执行数据库迁移:
1 | php artisan migrate |
现在数据库就多出了一个articles
表。现在想给表中增加一个excerpt
字段,我们可以执行回滚,然后修改原来的文件再执行迁移,也可以创建一个新的迁移文件:
1 | php artisan make:migration add_excerpt_to_articles_table —table=articles |
如果不加 --table
参数,则生成的迁移文件只包含基础代码。
修改新生成的文件:
1 | public function up() |
再次执行迁移:
1 | php artisan migrate |
查看数据库,此时 excerpt
列已增加成功。