artisan make:迁移忽略子文件夹



我使用的是Laravel 5.6,并且当我调用artisan migrate时,database/migrations/中的迁移文件可以工作,但会跳过database/migrations/example等子文件夹中的移植文件。

即使artisan migrate:status也不显示子文件夹。

如何告诉Laravel也包括子文件夹中的迁移文件?

vendor\laravel\framework\src\Illuminate\Database\Migrations\Migrator.php line 465

自Laravel 5.7以来的相同行号我想,有这条线:

return Str::endsWith($path, '.php') ? [$path] : $this->files->glob($path.'/*_*.php');

这将查找与*_*.php模式匹配的根迁移路径。如果是**/*_*.php,你就会完成你想要的。


但是,好消息!它可以被黑客入侵!负责获取路径的方法:

vendor\laravel\framework\src\Illuminate\Database\Console\Migrations\BaseCommand.php line 19

表示您给命令的路径参数不会被清除或修改,

if ($this->input->hasOption('path') && $this->option('path')) {
return collect($this->option('path'))->map(function ($path) {
return ! $this->usingRealPath()
? $this->laravel->basePath().'/'.$path
: $path;
})->all();
}

因此,将path参数设置为database/migrations/**应该可以递归到子文件夹中。

php artisan migrate --path="database/migrations/**"

注意:然后,为了使每个migrate[:*]命令都能工作,您需要指定--path属性。我使用--path属性进行了迁移和回滚,并且成功了。

ServiceProvider中有一个方法可以为您做到这一点。

loadMigrationsFrom($paths)

您需要在AppServiceProvider中的引导方法中调用它,如下所示:

public function boot()
{
$paths = [your, custom, migration, directories];
$this->loadMigrationsFrom($paths);
}

完成此操作后,运行php artisan migtate将考虑子目录。

最新更新