很多人可能在学习Laravel框架的时候,对Laravel的数据库迁移(以下简称Migration)存在着疑惑:到底什么是Migration?为什么要用Migration?Migration到底方便在哪里?
好了,抱着这些问题,我们今天就一起来学习Migration。
问题1:什么是Migration?
回答:可以将Migration看作一种数据库的VCS(Version Control System),即版本控制系统。可以通过Laravel的artisan命令快速创建或还原Migration文件,来进行数据库的构架。
问题2:为什么要用Migration?
回答:使用Migration可以有效地对数据库进行版本控制,并且遵从了Single Responsibility Principle(单一职责原则),更加方便数据库的操控。
问题3:Migration到底方便在哪里?
基本不需要写SQL代码就能简单快速地组建起数据库结构,并且可以迅速Migrate或者Rollback,实现了数据库的版本控制和管理。
要使用Migration,我们可以用artisan命令来创建一个Migration文件:
# 先进入我们的Laravel项目的根目录
$ cd my-laravel-project
# 输入以下artisan命令
$ php artisan make:migration create_samples_table --create=samples_table
注意--create==samples_table
这个选项会告诉artisan我们是要建立一个新的名为samples的table,所以artisan会自动在database\migrations
目录下建立一个叫2017_03_13_061422_create_samples_table.php
的文件(其中前缀是创建该文件的日期和时间,所以每个人会稍有不同),并且会自动填充好Schema::create
这个方法,方便我们创建更多的column:
可以看到,Laravel已经为我们添加了三个Columns,一个是id,另外两个分别是由$table->timestamps()
创建的created_at和updated_at(类型是DATETIME)。
Laravel默认假设每个table都会存在一个id column,并且要求每个table都要有created_at和updated_at这两个column。
如果我们要在samples table里新增加一个叫my_sample_code的VARCHAR类型的column,我们该怎么做呢?
很简单,只需要加上这行:
$table->string('my_sample_code');
如果我们想限制VARCHAR的长度,那么可以在第二个参数中进行添加:
$table->string('my_sample_code', 100);
那么我们现在有了migration文件了,怎么样才能在数据库里建立起我们的samples
table呢?
只需要在我们的Laravel根目录下运行一个简单的artisan命令:
$ php artisan migrate
- 1
Voila! 大功告成!
现在我们在数据库里,就能看到一个叫samples的table了。
那么如果我们想对这个table进行修改或者添加其他column呢?
那么我们有两种选择:
第一种,如果刚刚建立起table,并没有数据,可以选择rollback或者reset,即使用
$ php artisan migrate:rollback
或者
$ php artisan migrate:refresh
值得注意的是,rollback这个命令默认选项只会向之前恢复一次migration,而refresh将会把所有migration全部重置,相当于
$ php artisan migrate:reset
$ php artisan migrate
其中reset命令会将所有的migration rollback到最初阶段。
第二种方法,就是再创建一个migration文件。但是我们需要先添加一个dependency。打开项目根目录下的composer.json文件,在require栏中添加doctrine/dbal
这个package:
"require": {
"php": ">=5.6.4",
"laravel/framework": "5.4.*",
"laravel/tinker": "~1.0",
"doctrine/dbal": "2.5.0"
},
接下来运行composer install
这个命令即可。好了,如过我们想把之前我们添加的my_sample_code
这个column长度限制为200,那么我们可以建立一个新的migration文件:
$ php artisan make:migration modify_samples_table --table=samples
其中我们在Schema::table函数中填入以下代码:
$table->string('my_sample_code', 200)->change();
然后再次migrate,就是这么简单!
那么如果我们想把这个column改成其他类型呢?比如我们想将其换成TEXT类型,那么需要怎么做呢?
$table->text('my_sample_code')->change();
再次运行migrate即可!