我使用的是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
将考虑子目录。