web-dev-qa-db-ja.com

Laravel "app / database / migrations"フォルダでマイグレーションを再帰的に実行する

何十ものテーブルがあるので、migrationsフォルダーは次のようになります。

migrations/
  create_user_table.php
  relations/
  translations/

すべてのマイグレーションとシードを更新しようとしていますが、マイグレーションを再帰的に実行するためのアーティザンコマンドがわからない(つまり、relationsでマイグレーションを実行する) translationsフォルダも)。

追加しようとしました--path="app/database/migrations/*"ただし、エラーが発生します。誰かがこれの解決策を知っていますか?

27
tiffanyhwang

現在それを行う唯一の方法は、すべての移行を手動で行うことです。つまり、各サブフォルダーで移行コマンドを実行する必要があります。

php artisan migrate --path=/app/database/migrations/relations  
php artisan migrate --path=/app/database/migrations/translations

ただし、できることは、Artisanシステムを簡単に拡張して、migrationsフォルダーの下のすべてのフォルダーを反復処理する独自の移行コマンドを記述し、これらのコマンドを作成して実行することです。

職人を介してこれを実行したくない場合は、単にシェルスクリプトを記述することもできます。

編集:Laravel> = 5.0の場合、サブディレクトリの移行ファイルを移行するための正しいコマンドは次のとおりです:

php artisan migrate --path=/database/migrations/relations
php artisan migrate --path=/database/migrations/translations

37

これはbootメソッドに追加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

16
Vinco Velky

次のようにワイルドカードを使用することもできます。

php artisan migrate --path=/database/migrations/*
11
David Driessen

Laravel 5では、データベースフォルダーはデフォルトでアプリフォルダーの横に配置されます。したがって、これを実行して単一フォルダーの移行を移行できます。

php artisan migrate --path=/database/migrations/users
3
Sam Deering

次のコマンドを使用して、これを再帰的に実行できます。

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

**/*globstarとも呼ばれます

これが機能する前に、bashがglobstarをサポートしているかどうかを確認する必要があります。これを行うには、shoptを実行してglobstarをチェックします。

Globstarは、ほとんどのサーバーディストリビューションでデフォルトでサポートされていますが、MACでは機能しない可能性があります。

Globstarの詳細については、以下を参照してください。 https://www.linuxjournal.com/content/globstar-new-bash-globbing-option

2
Mazzy

これは「直接的な」解決策ではありませんが、laravelプロジェクトでモジュール性を検討することをお勧めします。

モジュールは、アプリケーションをいくつかの小さな「フォルダー」に分割し、移行、シード、クラス、ルート、コントローラー、コマンドを簡単にメンテナンス可能なフォルダーにまとめることができます。

このパッケージは良いスタートです: https://github.com/pingpong-labs/modules

1
Ifnot

簡単な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
0
shahalpk

簡単な解決策は、たとえば(igrate:all)のようなArtisanコマンドを作成することです。

次に、以下に説明するように、ハンドル関数内で各サブディレクトリの移行コマンドを定義します。

Artisan::call('migrate', [
   '--path' => '/database/migrations/employee'
]);
0
DANISH

どうぞ!

 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/');

MigrationServiceProviderを書き直しました。

- registerResetCommand()
- registerStatusCommand()
- registerMigrateCommand()

そこで、独自のコマンドを登録できます。

class MigrateCommand extends Illuminate\Database\Console\Migrations\MigrateCommand

その後、あなたはあなただけのディレクトリを拡張する必要があります:

protected function getMigrationPaths()

または、アプリケーションの起動時にパスを登録するだけです。 「$ this-> loadMigrationsFrom」について理解する前に、すでに解決策を実行しました。

0
Sphinxila

相対パスのみが機能します(Laravel 5.7):

php artisan migrate --path=database/migrations/your-folder-with-migrations
0
Štefan Ondáš