我的博客项目是开源的,如果有人想运行这个博客看看的话,Laravel 数据库迁移可以让我们的数据结构保持一致。在博客项目中,创建文章依赖于专栏,先来实现专栏数据表的迁移和数据填充。

Laravel 的数据库迁移就像是数据库的版本控制,让你的团队能够轻松地去定义和共享程序的数据库结构。迁移通常配合 Laravel 的结构生成器,可以轻松生成应用程序的数据库结构。如果团队中有成员在他的本地数据库环境中手动的添加了某个字段,那么你将会面对如何解决数据库迁移的问题。

移除多余迁移文件

Laravel 项目迁移文件都存放在database/migrations目录下,Laravel 项目默认生产了 4 个迁移文件:

  1. 2014_10_12_000000_create_users_table.php
  2. 2014_10_12_100000_create_password_resets_table.php
  3. 2019_08_19_000000_create_failed_jobs_table.php
  4. 2019_12_14_000001_create_personal_access_tokens_table.php


Laravel 默认创建的四个迁移文件,一个用于构建用户表,一个用于构建密码重置表,一个用于构建任务失败表,一个是构建访问令牌的表。这四个迁移文件�在我的博客项目中用不到,所以这里全部删除。

  1. rm database/migrations/2014_10_12_000000_create_users_table.php
  2. rm database/migrations/2014_10_12_100000_create_password_resets_table.php
  3. rm database/migrations/2019_08_19_000000_create_failed_jobs_table.php
  4. rm database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php

创建专栏迁移文件

接下来创建专栏迁移文件:

  1. php artisan make:migration create_columns_table

�打开 {timestamp}_create_columns_table.php 文件看看默认代码:

  1. <?php
  2. use Illuminate\Database\Migrations\Migration;
  3. use Illuminate\Database\Schema\Blueprint;
  4. use Illuminate\Support\Facades\Schema;
  5. return new class extends Migration
  6. {
  7. /**
  8. * Run the migrations.
  9. *
  10. * @return void
  11. */
  12. public function up()
  13. {
  14. Schema::create('columns', function (Blueprint $table) {
  15. $table->id();
  16. $table->timestamps();
  17. });
  18. }
  19. /**
  20. * Reverse the migrations.
  21. *
  22. * @return void
  23. */
  24. public function down()
  25. {
  26. Schema::dropIfExists('columns');
  27. }
  28. };

可以看到在该文件里面定义了一个匿名类,并继承自 Migration 基类。此类有两个方法 updown

  • 当我们运行迁移时,up 方法会被调用;
  • 当我们回滚迁移时,down 方法会被调用。

�创建数据表

up 方法里面,我们通过调用 Schema 类的 create 方法来创建 columns 表:

Schema::create('columns', function (Blueprint $table) {
      $table->id();
      $table->timestamps();
});

create 方法会接收两个参数:一个是数据表的名称,另一个则是接收 $table(Blueprint 实例)的闭包。

默认的数据表字段

迁移类中通过 Blueprint 的实例 $tablecolumns表创建所需的数据库字段。接下来让我们来详细讲解Blueprint实例 $table 的基本用法:

$table->id();

id()bigIncrements()的封装,此方法创建了一个 bigint unsigned类型的自增长 id。

$table->timestamps();

timestamps 方法创建了一个 created_at 和一个 updated_at 字段,分别用于保存用户的创建时间和更新时间。

回滚迁移

down方法会在回滚命令发起时被调用,是 up 方法的逆向操作。在上面的代码中,up 创建了 columns 表,那么这里将会通过调用 Schemadrop 方法来删除 columns 表。

新增字段

专栏数据表除了默认的 idcreated_atupdated_at 三个字段外还要新增一个name字段:

$table->string('name');

string() 方法接受两个参数,第一个参数是字段名称,这里传输入name,第二个参数是字符长度,可以省略,默认是 255name字段用于保存专栏名称。

.
.
.  
public function up()
{
    Schema::create('columns', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->timestamps();
    });
}
.
.
.

修改 .env文件

在迁移之前,还需要对应用根目录下的 .env 文件进行设置,为应用指定数据库名称 blog

.
.
.
DB_DATABASE=blog
DB_USERNAME=root
DB_PASSWORD=secret
.
.
.

执行迁移

运行下面的命令来生成执行迁移:

php artisan migrate

migrate 命令会执行所有未被执行过的迁移,执行完成后可以看到有 2 个表,分别是:

  1. migrations —— 第一次执行artisan migrate命令时生成的,其作用是用来做迁移版本
  2. columns —— 专栏表,保存专栏数据。

image.png