2017-01-19 1 views
0

これは私のプロセスです。私はコマンドを実行し、新しい接続を作成します。次に、その接続をデフォルトとして設定します。これは完全に機能します。Laravel - 接続をオーバーライドしますが、モデルは以前の接続からのデータを返します

また、別の接続を上書きします。ただし、新しい接続を作成してデフォルトに設定するのではなく、既存の接続をコピーするかデータベース情報を置き換えて、その接続を上書きするだけで、デフォルトを1つしか持てないからです。

私はすぐにこの接続を使用するモデルを作成します。私もそれに入り、$this->getConnection()をダンプして、それが私の新しい設定とconfigsに引っ張られているのを見てください。私の問題は、私が - > all()を実行すると、前回のオーバーライドされた接続から情報が得られることです。私は理由を知りません。ここで

は、私のコードのサンプルです:

public function handle() 
    { 
     if (!is_null($this->env = $this->option('env'))) { 
      (new Dotenv(base_path(), ".env.{$this->env}"))->overload(); 
     } 

     $this->setClientConnection(); 
     dd(\Override::getModel('User')->changeConnection('webApp')->get()->pluck('login_name', 'users_id')); 
    } 

    /** 
    * Create the database and a temporary connection 
    * 
    * @return null 
    */ 
    protected function setClientConnection() 
    { 
     $clientDb = env('DB_DATABASE'); 
     $userDb = env('DB_APP_DATABASE'); 
     // Create temporary connection 
     $newConnection    = config('database.connections.data'); 
     $newConnection['database'] = $clientDb; 
     config(['database.connections.' . $clientDb => $newConnection]); 

     // Set new connection as default 
     config(['database.default' => $clientDb]); 

     // Override Webapp database 
     $newUserConnection    = config('database.connections.webApp'); 
     $newUserConnection['database'] = $userDb; 
     config(['database.connections.webApp' => $newUserConnection]); 
    } 

だけ繰り返すために、新しい接続を作成し、完璧な作品をデフォルトに設定します。新しい接続を作成し、それを使用して既存の接続を上書きするconfig('database.connections.webApp')は新しい接続情報を返します。 (new App\User)->getConnection()が適切な設定を返し、データベースが新しいデータベースに設定されます。モデルオブジェクトを見ると、すべてが正しく表示されます。次に、->all()コールを作成して、オーバーライドされた接続をプルして、古いデータベースからプルします。

P.S. changeConnectionメソッドを追加していくつかのことをテストし、異なる保護属性を調べました。私のダンピングのほとんどは、そこからやってみましたが、新しい接続を使用しているように見えます。

+0

オーバーライドとは何ですか?それはカスタムクラスですか? – Paras

+0

これはモデルクラスを取得し、そのクラスをチェックする私たちの方法です。クライアント固有のオーバーライド –

+0

オーバーライドクラスのコードを投稿する必要があると思います。 – Paras

答えて

1

Eloquentモデルでget()を実行すると、Illuminate\Query\Builderオブジェクト(Illuminate \ Eloquent \ Query \ Builderラッパー関数を実行した後)でクエリが実行されます。

Illuminate\Query\Builderオブジェクトには、クエリに使用された接続オブジェクトの参照が格納されます。

モデルが最初に作成され、その後、接続が変更されているので、クエリビルダオブジェクトは、まだあなたがモデルクエリービルダーの新鮮なインスタンスを作成する必要があり、この問題を解決するには、古い接続

を使用しています新しい接続

でこれを行うには、複数の方法があります。

  1. は静的関数を使用してくださいそのよう$model->newFromBuilder($model->getAttributes, 'connection_name')
  2. はそうのような新鮮な雄弁ビルダーを取得するためにnewQuery方法を使用します:$model->setConnection('connection_name')->newQuery()->find($userId)
  3. はそうのようなfresh方法を使用します。User::on('connection_name')->find($userId)
  4. はそうのようなnewFromBuilder方法を使用します$model->setConnection('connection_name')->fresh()

ただし、新しいメソッドは新しいクエリを実行しますが、他のオプションは新しいクエリを起動せずに接続を設定します。

機能のあなたの選択はあなただけ(#3のような)ビルダーオブジェクトを必要とするかどうかは、すでにモデルのインスタンスを持っているかどうか、あなたは、静的メソッドを使用したいと

    1. に基づいてされるだろうにか実際にモデルインスタンスが必要です
  • 関連する問題