方便团队合作的 Laravel Migration

需求

在数据库建表来存储文章信息,表名为:topics。

最简单的做法,直接通过MySQL客户端建表,如果后期有修改,也直接通过MySQL客户端来修改。

问题

如果是小型应用或者个人项目,通过MySQL客户端建表的方式能够快速满足需求,但是对于大型项目,可能存在以下问题:

  • 如何把数据库的每一次变动都记录下来?

  • 如何在团队间传递数据库的变动?

  • 如何在不同的运行环境之间同步数据库的变动,比如从开发环境到生产环境?

关于 Laravel Migration

Laravel Migration巧妙的解决了上述问题,它就像是对数据库进行的版本控制,让你的团队能够轻松地去定义和共享程序的数据库结构。 Laravel Migration通常配合 Laravel 的结构生成器,可以轻松生成应用程序的数据库结构。

创建表

 % php artisan make:migration create_topics_table
Created Migration: 2020_10_19_094104_create_topics_table

打开database/migrations下新增的数据库迁移文件,补充数据库的结构,最终如下:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateTopicsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('topics', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('topics');
    }
}

执行迁移

php artisan migrate

复杂一些的情况

// 创建分类
Category::factory()->times(10)->create()->each(function ($category) {
    $category->datas()->saveMany(
        // 每个分类下创建服务
        Data::factory()->times(mt_rand(1, 20))->create()->each(function ($data) {
            $data->apis()->saveMany(
                // 每个服务下创建API
                DataApi::factory()->times(mt_rand(1, 20))->create()
            );

            $data->errorCodes()->saveMany(
                // 每个服务下创建错误码
                DataErrorCode::factory()->times(mt_rand(1, 20))->create()
            );
        })
    );
});