原文: https://blog.sbot.io/articles/12/Laravel-数据库迁移(Database-Migrations)操作实例
很多人可能在学习Laravel
框架的时候,对Laravel
的数据库迁移(以下简称Migrations
)存在着疑惑:
1. 什么是 Migrations?
2. 为什么要用 Migrations?
3. Migrations 到底方便在哪里?
好了,抱着这些问题,我们今天就一起来学习Migrations
。
什么是 Migrations?
我们先来看一下Laravel
官方文档怎么写的:
Migrations are like version control for your database, allowing your team to easily modify and share the application's database schema. Migrations are typically paired with Laravel's schema builder to easily build your application's database schema. If you have ever had to tell a teammate to manually add a column to their local database schema, you've faced the problem that database migrations solve.
简单概括起来,就是我们可以将Migrations
看作一种数据库的VCS
(Version Control System
),即版本控制系统。
可以通过Laravel
的artisan
命令快速创建、修改或还原数据库结构。
为什么要用 Migrations?
使用Migrations
可以有效地对数据库进行版本控制,并且遵从了Single Responsibility Principle
(单一职责原则),更加方便数据库的操控。
举个例子来说,假设我们已经设计并创建好了数据库,数据已经填充进数据库了,现在我们发现需要在其中一张表里增加一个名为name
的栏目(column
),需要在另一张表中将author
栏目的名字改为user
,那么我现在进入数据库里,进行了操作。刚刚操作完,公司老板突然找我面谈。面谈完了之后,我忘记了将我在数据库里的操作记录下来或者告知给其他开发人员,那么随之而来的很可能是灾难性的结果。
如果我们使用了Migrations
,并且只通过Migrations
进行数据库的操作,那么所有开发人员都可以看到数据库进行了哪些操作,而不会发生上述的情况。
Migrations 到底方便在哪里?
除了上述提到的版本控制功能外,我们几乎不需要写SQL
代码就能简单快速地组建起数据库结构,并且可以迅速迁移(migrate
)或者回滚(Rollback
),省去了大量人工操作的繁琐。
讲解完了概念,我们现在来看一下具体怎么使用Migrations
。
要创建一个迁移文件,我们可以用以下artisan
命令:
$ php artisan make:migration create_samples_table --create=samples
注意php artisan
命令需要在项目根目录下运行。--create==samples
这个选项表明我们想要建立一个名为samples
的数据库表,所以artisan
会自动在database\migrations
目录下建立一个叫2017_03_13_061422_create_samples_table.php
的文件(其中前缀是创建该文件的日期和时间,用于区分迁移文件的时间先后顺序),并且会自动填充好Schema::create
这个方法,方便我们创建更多的column
:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateSamplesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('samples', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('samples');
}
}
我们看到,这个类中有up
和down
两个方法。up
中我们需要添加创建数据表的函数,以及添加各个栏目的名称及属性。而down
方法中我们需要添加在回滚该迁移文件时应该有什么样的结果(这里我们直接删除这张表)。
可以看出,up
和down
中的操作是对应的,在up
中进行了什么操作,down
中就需要撤销这些操作。
现在我们详细来看一下up
方法。我们看到,Schema::create
这个方法是用来创建我们数据表的,在方法中,我们看到Laravel
已经为我们填充了几个columns
。
$table->increments('id')
将创建一个名为id
的column
,并赋予PRIMARY KEY
、UNSIGNED
及AUTO INCREMENT
属性。$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);
好了,我们暂时就只需要这些栏目。现在我们已经有了迁移文件了,怎么样才能在数据库里建立起我们的表呢?
很简单,输入
$ php artisan migrate
等待命令完成就可以了。
现在我们在数据库里,就能看到我们的samples
表了。
注意:运行
php artisan migrate
之前请检查你的.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();
然后我们重置数据库并做种:
$ php artisan migrate:refresh --seed
这样就完成了。打开samples
表,我们会发现新的栏目已经被创建。
注意,php artisan migrate:refresh
命令相当于
$ php artisan migrate:reset
$ php artisan migrate
所以我们经常会使用到。
2. 另一种情况,我们需要详细记录每一个数据库操作,例如在
production
环境下进行数据库修改。
首先我们需要添加一个package
:
$ composer require doctrine/dbal
要进行表的修改必须添加以上包裹。
完成后我们需要创建一个新的迁移文件:
$ php artisan make:migration add_url_field_to_samples_table --table=samples
我们想要添加一个url
栏目,并且让它在name
之后,我们在Schema::table
函数中填入以下代码:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class ModifySamplesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('samples', function (Blueprint $table) {
$table->string('url', 200)->after('name');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('samples', function (Blueprint $table) {
$table->dropColumn('url');
});
}
}
完成后,我们运行migrate
:
$ php artisan migrate
这样,url
就被添加进了sample
表中,并且位置处于name
之后。
我们在samples
表中插入了新的url
栏目,那么现在如果我们想把name
这个栏目长度限制从100
修改为50
,该怎么做呢?
同理,我们需要先创建一个migration
:
$ php artisan make:migration modify_name_column_in_samples_table --table=samples
在migration
文件中,我们添加以下代码:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class ModifyNameColumnInSamplesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('samples', function (Blueprint $table) {
$table->string('name', 50)->change();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('samples', function (Blueprint $table) {
$table->string('name', 100)->change();
});
}
}
完成后,我们再次运行migrate
:
$ php artisan migrate
这样一来就完成了栏目的修改,非常的直观。
注意:如果我们想把某个栏目改成其他类型,可以采用以下语法
$table->text('name')->change();
完成之后,再次运行php artisan migrate
,我们就可以看到name
已经从VARCHAR
变为了TEXT
类型了。
好了,以上就是Laravel
数据库迁移的基本概念及操作实例。对于需要了解更多的朋友,请移步至以下Laravel
官方链接进行深入学习:
转: Laravel的数据库迁移 介绍的比较清晰的更多相关文章
-
laravel中数据库迁移的使用:
创建数据库迁移文件: php artisan make:migration create_links_table 创建完表之后,设置字段: public function up() { Schema: ...
-
laravel执行数据库迁移的过程中出现Illuminate\Database\QueryException : SQLSTATE[HY000] [2002] Operation timed out (SQL: select * from information_schema.tables where table_schema = shop and table_name = migrations
向customers表添加字段phone php artisan make:migration add_phone_to_customers_table 问题: 解决方法: 将DB_HOST配置项修改 ...
-
Laravel进行数据库迁移(migration)
迁移(migration) 文档的简介是:迁移就像数据库的版本控制,允许团队简单轻松的编辑并共享应用的数据库表结构,迁移通常和 Laravel 的结构构建器结对从而可以很容易地构建应用的数据库表结构. ...
-
Laravel 5 数据库迁移文件示例
php artisan make:migration create_stocks_table 在项目根目录执行上面的命令后,会在database/migrations目录下生成2016_06_03_1 ...
-
Laravel数据库迁移
Laravel的数据迁移功能很好用,并且可以带来一系列好处.通过几条简单的 artisan 命令,就可以顺利上手,没有复杂的地方 注意:该系列命令对数据库非常危险,请准备一个单独的数据库作为配套练习, ...
-
Laravel 5.2 数据库迁移和数据填充
一.数据库迁移 Laravel 的数据库迁移提供了对数据库.表.字段.索引的一系列相关操作.下面以创建友情链接表为例. 1. 创建迁移 使用 Artisan 命令 php artisan make: ...
-
laravel数据库迁移(三)
laravel号称世界上最好的框架,数据库迁移算上一个,在这里先简单入个门: laravel很强大,它把表中的操作写成了migrations迁移文件,然后可以直接通过迁移文件来操作表.所以 , 数据迁 ...
-
Laravel学习笔记(三)数据库 数据库迁移
该章节内容翻译自<Database Migration using Laravel>,一切版权为原作者. 原作者:Stable Host, LLC 翻译作者:Bowen Huang 正文: ...
-
Laravel 5 基础(六)- 数据库迁移(Migrations)
database migrations 是laravel最强大的功能之一.数据库迁移可以理解为数据库的版本控制器. 在 database/migrations 目录中包含两个迁移文件,一个建立用户表, ...
随机推荐
-
EasyTouch绑定事件在电脑上点击有效Android上无效的解决方法
最近做一个RPG类的游戏发现使用EasyTouch虚拟摇杆插件在电脑上点击有效Android上无效,查找资料发现是Easy Joystick中的一个属性interaction type要设置成 Dir ...
-
java基础-servlet-2:生命周期
1.加载(class load) 2.实例化 3.init() 4.doGet() 5.destroy 只有一个对象存在于服务端提供服务.再次访问,不会再起新对象.
-
重走java---Step 1
开发环境 1.使用java开发,首先要完成java运行环境的安装配置,JVM可以说是java最大的优点之一,就是它实现了java一次编译多次运行,关于JVM以后再详谈.安装配置JDK,完成java开发 ...
-
[锋利JQ]-图片提示效果
新知识点: 在HTML-Dom中 "style" 属性,是所有HTML标签共有的一个对象属性,这个对象属性可以为元素设置内嵌样式. style是元素的属性,但是它自身则是一个对象, ...
-
MYSQL 下一些常用操作命令:新建用户、修改密码、修改登录host等
1.登录服务器 mysql -u <用户名> -p 2.增加用户,并同时授权操作权限 grant select,insert,update,delete on <数据库>.* ...
-
jquery取消事件冒泡和取消默认行为
$('button').click(functon(e){ /*code*/ e.stopPropagation();//取消事件冒泡 e.preventDefault();//取消默认行为 })
-
写给Android App开发人员看的Android底层知识(7)
(十二)ContentProvider (1)ContentProvider是什么? ContentProvider,简称CP. 做App开发的同学,尤其是电商类App,对CP并不熟悉,对这个概念的最 ...
-
2017年11月Dyn365/CRM用户社区活动报名
UG是全球最大Dynamics的用户组织,由最终用户自发组织,由行业有经验的专家自愿贡献知识和经验的非营利机构,与会人员本着务实中立的态度,不进行推介产品,服务以及其他营销行为.在美国,微软Dynam ...
-
MacOS下Rails+Nginx+SSL环境的搭建(下)
五.以Production环境部署Rails项目 这里插一个题外话,我们之前是以development环境运行的rails项目,现在我们希望在实际的生产系统中跑一下看看.这是十分有必要的,应该在rai ...
-
iOS字典转字符串方法
新建Object文件 .h文件中 +(NSString *)convertToJsonData:(NSDictionary *)dict: .m文件中 +(NSString *)convertToJs ...