Laravel 为我们提供了数据库结构操作功能 Migrations (数据库迁移),我们可以通过它创建一张数据库表,改变其中的结构,并在此基础上提供迁移回滚功能。

但是,我们公司在进行 Laravel 开发的时候没有用到这个功能,先谈谈我们是怎么做的:

  1. 通过数据库建模工具导出 SQL 到数据库
  2. 大家连接到服务器上的公共数据库进行开发
  3. 表结构因需求变化时用 Navicat for MySQL 直接更改

直到我发现 Django 和 Cake PHP、Ruby On Rails 也提供类似的功能,我觉得我需要重新认识 Migrations 了。

Install

php artisan migrate:install

在配置好数据库以后,这条命令会在数据库中创建一个名叫 migrations 的表,包括字段:

  • id
  • migration
  • batch

这张表是 Migrations 的基础,用来标识数据库哪个迁移已经执行,哪个迁移还未执行。

Migration

数据库迁移文件是这套系统的重要组成部分,假如需要在现有的系统中加入博客文章功能,我们创建一个数据库迁移文件:

php artisan make:migration paper

然后从 database/migrations 找到刚刚创建的数据库迁移文件,它包含了 up (迁移)和 down (回滚)方法。定义一下 Paper 的 Schema:

public function up()
{
    Schema::create('papers', function (Blueprint $table) {
        $table->increments('id');
        $table->string('title');
        $table->text('content');
        $table->timestamps();
    });
}

public function down()
{
    Schema::dropIfExists('papers');
}

详细的 Schema 你可以看中文文档:https://laravel-china.org/docs/5.3/migrations

此刻我们的 Schema 相对于数据库结构更新,我们将它同步到数据库:

php artisan migrate

这时候会根据 Schema 创建一张名叫 papers 的表,另外 Migrations 会在表 migrations 插入一条记录表明这个迁移文件执行过,再次执行 migrate 不会重新执行迁移(即创建 papers 表)。

改变结构

后来流量越来越大,我们发现需要给 title 字段增加一个索引 ... 那应该怎么办呢?

引入一个 Composer 包,用以判断当前数据库的字段状态。

composer require doctrine/dbal

我们再创建一个数据库迁移文件:

php artisan make:migration paper_title_index

这个数据库迁移文件用于给 papers 表的 title 字段增加索引:

public function up()
{
    Schema::table('papers', function ($table) {
        $table->string('title')->index()->change();
    });
}

public function down()
{
    Schema::table('papers', function ($table) {
        $table->string('title')->change();
    });
}

这时候再执行 php artisan migrate,papers 表的 title 字段就有了索引。

Rollback

过了几天,由于数据量较少这个索引没有太大的用处,需要去掉这个索引(你事好多啊) ...

php artisan migrate:rollback --step=1

Rollback (回滚)是数据库版本控制的另一大核心功能,Step 表明了回滚的个数。在这里,我们需要撤销上一个迁移,那么我们设置 Step 为 1,执行过后索引就不存在了。如果不填写 Step,则会回滚上一次执行的所有迁移,它和 Reset 的区别也就在这里。

执行一次 migrate 可以运行多个迁移,所以 migrations 表中有一个 batch 字段,插入的时候为现有最大 batch + 1,用于表明这个迁移是第几次。

Reset

那过了一天,发现根本就没有人看你的文章(摔!),想要去掉这个功能 ... 代码可以根据 Git 到指定 Commit,那数据库怎么办?

php artisan reset

Laravel 为我们提供了重置,可以回滚所有迁移。

Status

php artisan status

你可以得到像下图的结果。

migrate status

Refresh

这条命令会回滚所有的迁移(Reset),接着重新执行所有迁移(Migrate)。

通常被用于重置数据库。

所以

使用 Migrations 后,不必再拘泥于一台中心数据库,每位开发人员都可以使用自己机器上的数据库,不再为数据库版本控制而困扰。

结论:Migrations 可以让数据库结构和代码一起进行版本控制

已有 2 条评论

  1. 请问哪里可以看一下数据库操作的例子?简单的表格显示数据弄了一天还没好 = =

    1. https://d.laravel-china.org/docs/5.5/queries

      我比较推荐 Laravel China 翻译的文档,这里有对于数据库操作的例子;另外 Eloquent ORM 也是非常推荐学习使用的,用起来非常方便。

作者 cenegd

分类 笔记

时间

标签