Laravel的迁移文件是管理数据库表结构变更的核心工具,通过它可以快速创建、修改、删除数据表,同时支持版本回溯,避免直接操作数据库带来的风险。迁移文件默认存放在database/migrations目录下,每个文件都对应一次数据库结构变更操作。

一、创建Laravel迁移文件
创建迁移文件主要通过Laravel自带的Artisan命令行工具完成,根据需求不同,创建方式分为以下几种:
1. 创建基础迁移文件
如果需要创建一个空的迁移文件,用于自定义表结构变更逻辑,可以执行以下命令:
php artisan make:migration create_test_table
执行后会生成类似2024_05_20_123456_create_test_table.php的文件,文件名前缀是创建时间,保证执行顺序正确。
2. 创建带表名和操作的迁移文件
如果需要直接指定要创建的数据表名称,或者要修改已有表结构,可以带上--create或--table参数:
--create=表名:表示本次迁移用于创建指定数据表--table=表名:表示本次迁移用于修改指定已存在的数据表
例如要创建一个名为users的用户表迁移文件,执行命令:
php artisan make:migration create_users_table --create=users
生成的迁移文件已经预设了up和down方法的基础结构,up方法定义执行迁移时的操作,down方法定义回滚时的操作。
3. 迁移文件内容编写示例
以创建users表为例,迁移文件的up方法内容如下:
<?php
use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;
class CreateUsersTable extends Migration
{
/**
* 执行迁移
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
/**
* 回滚迁移
*
* @return void
*/
public function down()
{
Schema::dropIfExists('users');
}
}
二、执行迁移文件
编写好迁移文件后,需要执行迁移命令将变更同步到数据库:
php artisan migrate
执行后Laravel会读取所有未执行过的迁移文件,按照文件名的时间顺序依次执行up方法,同时会在数据库的migrations表中记录已执行的迁移文件名,避免重复执行。
如果执行迁移时出现字段重复、表已存在等错误,可以先回滚再重新执行,或者修改迁移文件后重置迁移。
三、回滚Laravel迁移文件
回滚操作可以撤销已经执行的迁移变更,根据需求不同,回滚方式分为以下几种:
1. 回滚最近一次迁移
如果需要撤销最近一次执行的迁移操作,执行以下命令:
php artisan migrate:rollback
该命令会执行最近一次迁移批次中所有文件的down方法,比如一次执行了3个迁移文件,回滚时会同时撤销这3个文件的变更。
2. 回滚指定步数的迁移
如果需要回滚最近多次的迁移操作,可以带上--step参数指定回滚的批次数量:
# 回滚最近3次迁移批次 php artisan migrate:rollback --step=3
3. 回滚所有迁移
如果需要撤销所有已经执行的迁移变更,执行以下命令:
php artisan migrate:reset
该命令会按照迁移执行的逆序,依次执行所有已执行迁移文件的down方法,最终清空所有迁移创建的表结构。
4. 重置并重新执行所有迁移
如果需要先回滚所有迁移,再重新执行所有迁移,可以使用以下命令:
php artisan migrate:refresh
该命令相当于先执行migrate:reset,再执行migrate,常用于开发阶段调整表结构后重新初始化数据库。
如果需要重新执行迁移时带上种子数据填充,可以加上--seed参数:
php artisan migrate:refresh --seed
四、迁移相关注意事项
- 迁移文件一旦提交到版本库,尽量不要修改已经执行过的迁移文件内容,避免团队协作时出现数据库结构不一致的问题,新增变更建议创建新的迁移文件
- 生产环境执行迁移前,建议先在测试环境验证迁移文件的正确性,避免误操作导致数据丢失
- 如果需要修改已执行迁移的表结构,不要直接修改原迁移文件,而是创建新的修改表迁移文件,使用
Schema::table方法添加、修改、删除字段
修改表结构的迁移文件示例,给users表添加age字段:
<?php
use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;
class AddAgeToUsersTable extends Migration
{
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->integer('age')->nullable()->after('name');
});
}
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('age');
});
}
}