Laravel框架数据库迁移操作实例详解
很多人可能在学习Laravel框架的时候,对Laravel的数据库迁移(以下简称Migrations)存在着疑惑:
1.什么是Migrations?
2.为什么要用Migrations?
3.Migrations到底方便在哪里?
好了,抱着这些问题,我们今天就一起来学习Migrations。
什么是Migrations?
我们先来看一下Laravel官方文档怎么写的:
Migrationsarelikeversioncontrolforyourdatabase,allowingyourteamtoeasilymodifyandsharetheapplication'sdatabaseschema.MigrationsaretypicallypairedwithLaravel'sschemabuildertoeasilybuildyourapplication'sdatabaseschema.Ifyouhaveeverhadtotellateammatetomanuallyaddacolumntotheirlocaldatabaseschema,you'vefacedtheproblemthatdatabasemigrationssolve.
简单概括起来,就是我们可以将Migrations看作一种数据库的VCS(VersionControlSystem),即版本控制系统。
可以通过Laravel的artisan命令快速创建、修改或还原数据库结构。
为什么要用Migrations?
使用Migrations可以有效地对数据库进行版本控制,并且遵从了SingleResponsibilityPrinciple(单一职责原则),更加方便数据库的操控。
举个例子来说,假设我们已经设计并创建好了数据库,数据已经填充进数据库了,现在我们发现需要在其中一张表里增加一个名为name的栏目(column),需要在另一张表中将author栏目的名字改为user,那么我现在进入数据库里,进行了操作。刚刚操作完,公司老板突然找我面谈。面谈完了之后,我忘记了将我在数据库里的操作记录下来或者告知给其他开发人员,那么随之而来的很可能是灾难性的结果。
如果我们使用了Migrations,并且只通过Migrations进行数据库的操作,那么所有开发人员都可以看到数据库进行了哪些操作,而不会发生上述的情况。
Migrations到底方便在哪里?
除了上述提到的版本控制功能外,我们几乎不需要写SQL代码就能简单快速地组建起数据库结构,并且可以迅速迁移(migrate)或者回滚(Rollback),省去了大量人工操作的繁琐。
讲解完了概念,我们现在来看一下具体怎么使用Migrations。
要创建一个迁移文件,我们可以用以下artisan命令:
$phpartisanmake:migrationcreate_samples_table--create=samples
注意phpartisan命令需要在项目根目录下运行。--create==samples这个选项表明我们想要建立一个名为samples的数据库表,所以artisan会自动在database\migrations目录下建立一个叫2017_03_13_061422_create_samples_table.php的文件(其中前缀是创建该文件的日期和时间,用于区分迁移文件的时间先后顺序),并且会自动填充好Schema::create这个方法,方便我们创建更多的column:
increments('id'); $table->timestamps(); }); } /** *Reversethemigrations. * *@returnvoid */ publicfunctiondown() { Schema::dropIfExists('samples'); } }
我们看到,这个类中有up和down两个方法。up中我们需要添加创建数据表的函数,以及添加各个栏目的名称及属性。而down方法中我们需要添加在回滚该迁移文件时应该有什么样的结果(这里我们直接删除这张表)。
可以看出,up和down中的操作是对应的,在up中进行了什么操作,down中就需要撤销这些操作。
现在我们详细来看一下up方法。我们看到,Schema::create这个方法是用来创建我们数据表的,在方法中,我们看到Laravel已经为我们填充了几个columns。
$table->increments('id')将创建一个名为id的column,并赋予PRIMARYKEY、UNSIGNED及AUTOINCREMENT属性。
$table->timestamps()将创建created_at和updated_at两个column(类型是DATETIME)。
注意:Laravel默认认为每个table都会存在一个id栏目,并且要求每个table都要有created_at和updated_at这两个栏目。
现在,我们要在samples表里增加一个名为name的VARCHAR类型的栏目,该怎么做呢?
很简单,只需要加上这行:
$table->string('name');
如果我们想限制VARCHAR的长度,可以在第二个参数中进行注明:
$table->string('name',100);
好了,我们暂时就只需要这些栏目。现在我们已经有了迁移文件了,怎么样才能在数据库里建立起我们的表呢?
很简单,输入
$phpartisanmigrate
等待命令完成就可以了。
现在我们在数据库里,就能看到我们的samples表了。
注意:运行phpartisanmigrate之前请检查你的.env文件中DB_DATABASE,DB_USERNAME,DB_PASSWORD几项配置是否正确。如果你在Homestead下进行Laravel开发,那么DB_USERNAME默认为homestead,DB_PASSWORD默认为secret,DB_DATABASE请根据你的项目具体填入你的数据库名称。
现在问题来了,我们突然想在samples表里,添加一个名为url的栏目,该怎么做呢?我们分情况讨论。
1.我们处于本地开发阶段,数据使用种子(Seed)文件进行填充。
对于本地开发,如果想省事,可以直接在samples表的迁移文件中,添加上我们需要的栏目:
$table->string('url',200)->nullable();
然后我们重置数据库并做种:
$phpartisanmigrate:refresh--seed
这样就完成了。打开samples表,我们会发现新的栏目已经被创建。
注意,phpartisanmigrate:refresh命令相当于
$phpartisanmigrate:reset $phpartisanmigrate
所以我们经常会使用到。
2.另一种情况,我们需要详细记录每一个数据库操作,例如在production环境下进行数据库修改。
首先我们需要添加一个package:
$composerrequiredoctrine/dbal
要进行表的修改必须添加以上包裹。
完成后我们需要创建一个新的迁移文件:
$phpartisanmake:migrationadd_url_field_to_samples_table--table=samples
我们想要添加一个url栏目,并且让它在name之后,我们在Schema::table函数中填入以下代码:
string('url',200)->after('name'); }); } /** *Reversethemigrations. * *@returnvoid */ publicfunctiondown() { Schema::table('samples',function(Blueprint$table){ $table->dropColumn('url'); }); } }
完成后,我们运行migrate:
$phpartisanmigrate
这样,url就被添加进了sample表中,并且位置处于name之后。
我们在samples表中插入了新的url栏目,那么现在如果我们想把name这个栏目长度限制从100修改为50,该怎么做呢?
同理,我们需要先创建一个migration:
$phpartisanmake:migrationmodify_name_column_in_samples_table--table=samples
在migration文件中,我们添加以下代码:
string('name',50)->change(); }); } /** *Reversethemigrations. * *@returnvoid */ publicfunctiondown() { Schema::table('samples',function(Blueprint$table){ $table->string('name',100)->change(); }); } }
完成后,我们再次运行migrate:
$phpartisanmigrate
这样一来就完成了栏目的修改,非常的直观。
注意:如果我们想把某个栏目改成其他类型,可以采用以下语法
$table->text('name')->change();
完成之后,再次运行phpartisanmigrate,我们就可以看到name已经从VARCHAR变为了TEXT类型了。
好了,本文主要讲解了Laravel框架中数据库迁移操作的方法实例,更多关于Laravel框架的使用技巧请查看下面的相关链接