所以我的迁移文件夹看起来像这样,因为我有几十个表,它保持整洁有序:
migrations/
create_user_table.php
relations/
translations/
我正在尝试刷新所有迁移和种子,但似乎我遇到了轻微的打嗝,我不知道工匠命令以递归方式运行迁移(即在{{1}中运行迁移}和relations
文件夹也是如此。
我尝试添加translations
,但它会出错。有谁知道这个解决方案?
答案 0 :(得分:33)
现在唯一可行的方法是手动完成所有迁移。也就是说,您必须在每个子文件夹上运行迁移命令:
php artisan migrate --path=/app/database/migrations/relations
php artisan migrate --path=/app/database/migrations/translations
但是,您可以轻松扩展工匠系统以编写您自己的迁移命令,该命令将遍历迁移文件夹下的所有文件夹,为您创建这些命令并运行它们。
如果您不想通过工匠
进行此操作,您也可以简单地编写一个shell脚本编辑:对于Laravel> = 5.0,在子目录中迁移迁移文件的正确命令是:
php artisan migrate --path=/database/migrations/relations
php artisan migrate --path=/database/migrations/translations
答案 1 :(得分:12)
在 AppServiceProvider
中添加启动方法$mainPath = database_path('migrations');ň
$directories = glob($mainPath . '/*' , GLOB_ONLYDIR);
$paths = array_merge([$mainPath], $directories);
$this->loadMigrationsFrom($paths);
现在您可以使用php artisan migrate
和php artisan migrate:back
答案 2 :(得分:10)
你也可以使用通配符,如下所示:
php artisan migrate --path=/database/migrations/*
答案 3 :(得分:3)
在Laravel 5中,默认情况下,数据库文件夹位于app文件夹旁边。因此,您可以运行此操作来迁移单个文件夹迁移:
php artisan migrate --path=/database/migrations/users
答案 4 :(得分:2)
您可以尝试使用此软件包nscreed/laravel-migration-paths。默认情况下, migrations 文件夹中的所有子目录将自动加载。即使您可以非常轻松地添加任何目录。
'paths' => [
database_path('migrations'),
'path/to/custom_migrations', // Your Custom Migration Directory
],
仅通用命令就不需要任何特殊命令:php artisan migrate
将完成您的任务。
答案 5 :(得分:1)
这不是"直接"解决方案,但我建议您将模块化视为您的laravel项目。
模块可以将您的应用程序分成几个较小的"文件夹"并将迁移,种子,类,路由,控制器,命令放在易于维护的文件夹中。
这个包是一个好的开始:https://github.com/pingpong-labs/modules
答案 6 :(得分:1)
您可以使用以下命令以递归方式执行此操作:
php artisan migrate --path=/database/migrations/**/*
**/*
也称为globstar
在此之前,您必须检查您的bash是否支持globstar。
您可以执行shopt
并检查globstar
。
大多数服务器发行版默认支持Globstar,但可能不适用于MAC。
有关globstar的更多信息,请参阅:https://www.linuxjournal.com/content/globstar-new-bash-globbing-option
答案 7 :(得分:0)
简单的Laravel解决方案是创建gulp任务(比如migrate-others
)。
var elixir = require('laravel-elixir');
var gulp = require('gulp');
var shell = require('gulp-shell')
/*
|--------------------------------------------------------------------------
| Elixir Asset Management
|--------------------------------------------------------------------------
|
| Elixir provides a clean, fluent API for defining some basic Gulp tasks
| for your Laravel application. By default, we are compiling the Sass
| file for our application, as well as publishing vendor resources.
|
*/
elixir(function(mix) {
mix.sass('app.scss');
});
// Our Task
gulp.task('migrate-others', shell.task([
'php artisan migrate --path=/app/database/migrations/relations',
'php artisan migrate --path=/app/database/migrations/translations',
]));
现在您可以直接致电
gulp migrate-others
答案 8 :(得分:0)
你走了!
function rei($folder)
{
$iterator = new DirectoryIterator($folder);
system("php artisan migrate --path=" . $folder);
foreach ($iterator as $fileinfo) {
if ($fileinfo->isDir() && !$fileinfo->isDot()) {
echo $fileinfo->getFilename() . "\n";
rei($folder . $fileinfo->getFilename() . '/');
}
}
}
rei('./database/');
答案 9 :(得分:0)
我重写了MigrationServiceProvider:
- registerResetCommand()
- registerStatusCommand()
- registerMigrateCommand()
您可以注册自己的命令:
class MigrateCommand extends Illuminate\Database\Console\Migrations\MigrateCommand
之后你只需要扩展你的目录:
protected function getMigrationPaths()
或者您只是在应用程序启动时注册路径。 在我知道'$ this-> loadMigrationsFrom'之前,我已经完成了我的解决方案。
答案 10 :(得分:0)
一个简单的解决方案是创建一个Artisan Command(例如:migrate:all),
然后在句柄函数内定义每个子目录的migrate命令,如下所述。
Artisan::call('migrate', [
'--path' => '/database/migrations/employee'
]);
答案 11 :(得分:0)
只有相对路径对我有用(在Laravel 5.7中):
php artisan migrate --path=database/migrations/your-folder-with-migrations
答案 12 :(得分:0)
这适用于 Laravel 8
php artisan migrate --path=database/migrations/tenant