我的博客项目是开源的,如果有人想运行这个博客看看的话,Laravel 数据库迁移可以让我们的数据结构保持一致。在博客项目中,创建文章依赖于专栏,先来实现专栏数据表的迁移和数据填充。
Laravel 的数据库迁移就像是数据库的版本控制,让你的团队能够轻松地去定义和共享程序的数据库结构。迁移通常配合 Laravel 的结构生成器,可以轻松生成应用程序的数据库结构。如果团队中有成员在他的本地数据库环境中手动的添加了某个字段,那么你将会面对如何解决数据库迁移的问题。
Laravel 项目迁移文件都存放在database/migrations
目录下,Laravel 项目默认生产了 4 个迁移文件:
Laravel 默认创建的四个迁移文件,一个用于构建用户表,一个用于构建密码重置表,一个用于构建任务失败表,一个是构建访问令牌的表。这四个迁移文件 在我的博客项目中用不到,所以这里全部删除。
rm database/migrations/2014_10_12_000000_create_users_table.php
rm database/migrations/2014_10_12_100000_create_password_resets_table.php
rm database/migrations/2019_08_19_000000_create_failed_jobs_table.php
rm database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php
接下来创建专栏迁移文件:
php artisan make:migration create_columns_table
打开 {timestamp}_create_columns_table.php
文件看看默认代码:
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('columns', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('columns');
}
};
可以看到在该文件里面定义了一个匿名类,并继承自 Migration
基类。此类有两个方法 up
和 down
:
up
方法会被调用;down
方法会被调用。在 up
方法里面,我们通过调用 Schema
类的 create
方法来创建 columns
表:
Schema::create('columns', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
create
方法会接收两个参数:一个是数据表的名称,另一个则是接收 $table
(Blueprint 实例)的闭包。
迁移类中通过 Blueprint
的实例 $table
为columns
表创建所需的数据库字段。接下来让我们来详细讲解Blueprint
实例 $table
的基本用法:
$table->id();
id()
是 bigIncrements()
的封装,此方法创建了一个 bigint unsigned
类型的自增长 id。
$table->timestamps();
由 timestamps
方法创建了一个 created_at
和一个 updated_at
字段,分别用于保存用户的创建时间和更新时间。
down
方法会在回滚命令发起时被调用,是 up
方法的逆向操作。在上面的代码中,up
创建了 columns
表,那么这里将会通过调用 Schema
的 drop
方法来删除 columns
表。
专栏数据表除了默认的 id
、created_at
和 updated_at
三个字段外还要新增一个name
字段:
$table->string('name');
由 string()
方法接受两个参数,第一个参数是字段名称,这里传输入name
,第二个参数是字符长度,可以省略,默认是 255
。name
字段用于保存专栏名称。
.
.
.
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 个表,分别是:
migrations
—— 第一次执行artisan migrate
命令时生成的,其作用是用来做迁移版本columns
—— 专栏表,保存专栏数据。