2017-10-07 16 views
2

私はいくつかの企業をループし、それぞれのためのデータベースを作る必要があるカスタムコンソールコマンドを持っています。このコマンドは現在動作しますが、一度だけ動作します。 2回目のループではマイグレーションは実行されません。したがって、基本的に2つの空のDB(db_on eとdb_two)があると、configが実行され、最初にdb_oneのマイグレーションが実行され、ループが再び実行されるときには何も起こりません。db_two。 DB名をエコーアウトするためにコンソールコマンドを置き換えた場合、両方が返されるので、ループではないことがわかります。また、ループの各接続で使用されるdbをログアウトすると、正しいDBになります。ここでArtisan Call in Loop

はコマンドです:

public function handle() 
{ 
    $companies = Company::all(); 

    foreach($companies as $company) 
    { 
     \Config::set('database.connections.company.database', $company->db_name); 

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

     $this->info( config('database.connections.company.database')); 

    } 
} 

ログエラー:

local.ERROR: Database [10_barrel] not configured. {"userId":1,"email":"[email protected]","exception":"[object] (InvalidArgumentException(code: 0): Database [db_2] not configured. at /Users/Sites/cheers/vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php:140) 

database.phpで

'connections' => [ 

     'main' => [ 
      'driver' => 'mysql', 
      'host' => env('MAIN_DB_HOST', '127.0.0.1'), 
      'port' => env('MAIN_DB_PORT', '3306'), 
      'database' => env('MAIN_DB_DATABASE', 'forge'), 
      'username' => env('MAIN_DB_USERNAME', 'forge'), 
      'password' => env('MAIN_DB_PASSWORD', ''), 
      'unix_socket' => env('MAIN_DB_SOCKET', ''), 
      'charset' => 'utf8mb4', 
      'collation' => 'utf8mb4_unicode_ci', 
      'prefix' => '', 
      'strict' => true, 
      'engine' => null, 
     ], 

     'company' => [ 
      'driver' => 'mysql', 
      'host' => env('COMPANY_DB_HOST', '127.0.0.1'), 
      'port' => env('COMPANY_DB_PORT', '3306'), 
      'database' => '', 
      'username' => env('COMPANY_DB_USERNAME'), 
      'password' => env('COMPANY_DB_PASSWORD'), 
      'unix_socket' => env('COMPANY_DB_SOCKET', ''), 
      'charset' => 'utf8mb4', 
      'collation' => 'utf8mb4_unicode_ci', 
      'prefix' => '', 
      'strict' => true, 
      'engine' => null, 
     ], 
] 

ENV:

COMPANY_DB_HOST=127.0.0.1 
COMPANY_DB_PORT=3306 
COMPANY_DB_USERNAME=root 
COMPANY_DB_PASSWORD= 
+0

ログファイルにはどのような線量が表示されますか? – Webdesigner

+0

@Webdesignerログ(スタックトレース全体ではありません)で見たトップエラーを追加しました – Packy

+0

このエラーはコマンドの直接の結果ですか? Laraelのバージョンは何ですか? – Webdesigner

答えて

0

かなり面白かったです。私は完全にあなたのエラーを再現することができませんでした(私はログに何のエラーもなかった)が、移行が第1回目のループ反復のためにのみ実行されていると言う必要があります。

まず最初の代わり:

Artisan::call 

は、私はあなたが使用することをお勧めします:

$this->call 

あなたが本当に何が起こっているかの余分な出力が得られます。

しかし、最も重要なことは、データベースから切断して接続をパージすることです。さもなければ、Laravelは設定でデータベース名を変更したことを認識せず、古いデータベースを使用します。

だからあなたが追加する必要があります

$this->laravel['db']->purge('company'); 

をループの最後に、このような移行を実行することを可能にします。

私はそれをテストしましたが、問題なく私のために働いています。

+0

パーフェクト。私は接続を削除しなければならないと感じました。よくできました。 – Packy

0

私はあなたのロジックにいくつか問題があると仮定します。設定にDB名を設定しますが、このDBを終了しますか?残りはどうですか?ユーザーのパスワード?彼らはいつも同じですか?

ループは問題ではありません。 $companies = Company::all();デフォルトのデータベースから日付を取得し、ループすることができます。

laravelがDBに接続できるのであれば、リスト内の最初のDBは既に存在していますが(デフォルトではmayby)、2番目のDBはありません。migrateはデータを作成しません。