2017-06-14 21 views
3

クライアント情報を持つマスターデータベースを持つマルチテナントアプリがあります。これにはさまざまなデータベースの設定があります。起動時にURLを読むことで、アクセスしているテナントを特定し、接続を切り替えて設定をキャッシュして、正しいテナントデータベースを使用するようにすることができます。この部分は動作しますが、問題はマイグレーションに伴い発生します。Laravel 5.4マルチテナントの移行、移行のための接続の切り替え

通常のLaravel移行ではマスターテーブルのみが処理されるため、更新ごとにすべてのテナントで実行する必要がある「テナント」の移行フォルダを追加しました。あなたがこれを見ることができるようにこれを行うために、私は、次のクラス

<?php 

namespace App\Console\Commands\Tenants; 

use Illuminate\Console\Command; 
use Illuminate\Support\Facades\DB; 

class UpdateTenant extends Command 
{ 
    protected $signature = 'tenant:update {slug}'; 
    protected $description = 'Update a tenants database'; 
    protected $migrator; 

    public function __construct() 
    { 
     parent::__construct(); 

     $this->migrator = app()->make('migrator'); 
    } 

    public function fire() 
    { 
     $arguments = $this->arguments(); 

     if ($account = DB::connection('root')->table('accounts')->where('slug', '=', $arguments['slug'])->first()) { 
      config()->set('database.connections.tenant.database', $arguments['slug']); 
      $this->migrator->setConnection('tenant'); 
      if (! $this->migrator->repositoryExists()) { 
       $this->call('migrate:install', ['--database' => 'tenant']); 
      } 
      $this->migrator->run([$this->laravel->basePath() . '/' . 'database/tenants']); 
      foreach ($this->migrator->getNotes() as $note) { 
       $this->output->writeln($note); 
      } 
     } 
    } 
} 

を使用するだけでスラグによって定義された1つのテナントのために、私はループに別のコマンドを持っており、すべてのテナントの職人コマンドを呼び出しています。ここ

foreach ($accounts as $account) { 
    $this->call('tenant:update', ['slug' => $account->slug]); 
} 

問題は、それが正しく、正しいテナント情報を発見されたスラグの値をチェックしますが、接続は、接続を切り替えるにもかかわらず、最初のテナントに引っかかってしまうことです。私はそれをルートに戻そうとしても、設定への変更を無視します。 laravelに接続をリセットして、config内の更新された値を使用して再接続するように指示することはありますか?テナントの間で現在の接続から

+0

DB :: disconnect( 'tenant')を使用してみてください。 configを設定してからmigrator-> setConnection()を呼び出す前に – btl

+1

それに取り組んでいるようですね!ありがとう、あなたが答えを書いておきたいなら私はそれを受け入れます、そうでなければ私は一緒に一つを置くことができます。 –

+0

私は、あなたのために働いてうれしい1つを書くことができます! – btl

答えて

2

の切断:

config()->set('database.connections.tenant.database', $arguments['slug']); 
DB::disconnect('tenant');<----- add this 
$this->migrator->setConnection('tenant'); 

これは、リソースの接続をクリーンアップし、正しい構成設定で自身を再確立するためにアプリを強制します。

関連する問題