Laravel 中的匿名迁移
发布日期 作者 Paul Redmond
Laravel 团队发布了 Laravel 8.37,其中包含匿名迁移支持,它解决了 GitHub 问题,即迁移类名冲突。问题的核心是,如果多个迁移具有相同的类名,则在尝试从头开始重新创建数据库时会导致问题。
在 Laravel 8.37 中,框架现在可以与匿名类迁移文件一起使用。以下是 拉取请求 测试中的示例
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::table('people', function (Blueprint $table) { $table->string('first_name')->nullable(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('people', function (Blueprint $table) { $table->dropColumn('first_name'); }); }};
匿名类功能还向后兼容命名迁移类,以便在 Laravel 8 中使用此功能!
尚不清楚框架是否会在某个时候更新迁移存根以默认使用匿名类;但是,拉取请求 #5585 更新了 laravel/laravel
应用程序启动器,以便在 users
、password_resets
和 failed_jobs
迁移中使用匿名类。
如果您想在您的项目中默认开始使用匿名迁移,您也可以 自定义 Laravel 中的存根。
// stubs/migration.create.stub 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('{{ table }}', function (Blueprint $table) { $table->id(); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('{{ table }}'); }};
请务必记住类末尾的尾部分号 (;
)
$example = new class { // ...};
更新 migration.stub
、migration.create.stub
和 migration.update.stub
后,您可以对其进行测试
$ php artisan make:migration --create=examples \ create_examples_tableCreated Migration: 2021_04_13_182612_create_examples
接下来,您需要更新应用程序中的 composer.json
以支持至少 Laravel 8.37
{ "require": { "laravel/framework": "^8.37", },}
最后,确保运行 composer update
来更新 VCS 中的 composer.lock
,以便迁移命令与支持此新功能的 Laravel 框架版本一起使用
composer update
您可以通过查看 拉取请求 #36906 来了解更多有关此功能的信息。