Laravel以递归方式在“app / database / migrations”文件夹上运行迁移

时间:2014-02-08 03:42:34

标签: php laravel database-migration

所以我的迁移文件夹看起来像这样,因为我有几十个表,它保持整洁有序:

migrations/
  create_user_table.php
  relations/
  translations/

我正在尝试刷新所有迁移和种子,但似乎我遇到了轻微的打嗝,我不知道工匠命令以递归方式运行迁移(即在{{1}中运行迁移}和relations文件夹也是如此。

我尝试添加translations,但它会出错。有谁知道这个解决方案?

13 个答案:

答案 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 migratephp 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