当我在Laravel中进行迁移时,它会自动显示如下:
public function up()
{
Schema::create('comments', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
});
}
但我希望工作更方便,我希望在创建和更新行时让数据库处理,而不是每次都自己处理。 我找到了一种方法,使这成为可能:
public function up()
{
Schema::create('comments', function (Blueprint $table) {
$table->increments('id');
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
});
}
但现在每次我进行迁移时,我都需要手动更改它,我认为这不是很方便。有人知道如何在Laravel中更改自动生成的迁移吗?
答案 0 :(得分:2)
如果你在源代码中挖掘,你会发现:
MigrationCreator
使用此文件进行迁移。原则上,您可以执行以下操作:
抓取内置的迁移文件并将其移动到项目的另一个文件夹中(例如,可能是resouces / stubs)请注意,即使您不能修改,也应该复制该文件夹中的其他存根它们。
然后,覆盖默认的迁移创建者以使用此文件,这应该有效:
class MyMigrationCreator extends MigrationCreator {
protected function stubPath() {
return base_path("resources"); //Or something valid
}
}
然后在您的应用程序服务提供商中,您可以:
$this->app->instance(MigrationCreator::class, resolve(MyMigrationCreator::class));
这将(希望)"技巧" laravel使用您的迁移创建者而不是默认创建者。但是,创建表并不是经常发生的事情,以证明所有这些麻烦。
更新:它应该扩展迁移创建者。
答案 1 :(得分:1)
在Laravel 5.6中,似乎无法覆盖MigrationCreator类,因为它直接在MigrationServiceProvider中使用:
protected function registerCreator() {
$this->app->singleton('migration.creator', function ($app) {
return new MigrationCreator($app['files']);
});
}
但是您可以通过以下方式入侵MigrationServiceProvider:
overrides/Illuminate/Database
vendor/laravel/framework/src/Illuminate/Database/MigrationServiceProvider.php
复制到overrides/Illuminate/Database
文件夹中(请注意,类名称空间将保持不变)修改overrides/Illuminate/Database/MigrationServiceProvider.php
:
protected function registerCreator() {
$this->app->singleton('migration.creator', function ($app) {
return new MyMigrationCreator($app['files']);
});
}
修改您的composer.json
("Illuminate\\"
):
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/",
"Illuminate\\": "overrides/Illuminate"
}
},
运行composer dump-autoload
。作曲家会说
`Warning: Ambiguous class resolution, "Illuminate\Database\MigrationServiceProvider" was found in both "$baseDir . '/overrides/Illuminate/Database/MigrationServiceProvider.php" and "/vendor/laravel/framework/src/Illuminate\Database\MigrationServiceProvider.php", the first will be used.`
现在将使用伪造的MigrationServiceProvider
代替Laravel,但您将无法使用原始的MigrationCreator
。这就是我们复制整个文件的原因。
实际上,您可以覆盖MyMigrationCreator
类,但是代码量很大,实际上您需要使用stubPath()
类扩展它,并覆盖create()
之类的几种方法,也许MigrationServiceProvider
。但是@Suspendable
可以很安全地被覆盖,因为它包含一些小的方法,在Laravel 6之前不太可能会更改