2017-07-28 18 views
0

Laravel雄弁、複数のスキーマクエリ

$q = ModelOne::with('relation_one', 'relation_two') 
    ->whereHas('relation_three', function ($q) { 
     $q->where('object', 'Obj1'); 
    }) 
    ->whereHas('relation_four', function ($q) { 
     $q->where('object', 'Obj2'); 
    }) 
    ->get();` 

それは結構relation_onerelation_two関係をロードし、私は、行ごとに別の関係をロードする必要があり、relation_three又はrelation_fourのいずれかに応じてModelOne->objectの値。

私が午前問題はModelOneschema1からのものであり、relation_three & relation_fourで使用されるテーブルはschema2からであるということです。

両方のモデルは、個別のprotected $connectionprotected $table変数で正しく設定されています。

私が受け取っているエラーは、サブクエリが間違ったスキーマをチェックしているので、relationship_threeまたはrelationship_fourのテーブルが存在しないということです。

誰でもこれを修正する方法を提案できますか?ドキュメントを見たことがありますが、解決策を見つけることができませんでした。

+0

をお知らせください。また、 'schema1'と' schema2'は何ですか?異なるデータベースですか? – t1gor

+0

私は両方の読み込みを試み、私が必要とする結果を得ることができるかどうかを確認するために、両方の関係が同じIDを含む両方のテーブルのためにロードされている場合に問題が発生する可能性があります。 – JonnyFoley

+0

はい、 'schema1'と' schema2'は異なるデータベースであり、既存のビジネスロジックのためにこのように残す必要があります。 – JonnyFoley

答えて

0

ない最もエレガントな解決策が、以下のような関係を呼び出して、参加して、この作業を得た:

$q = ModelOne::with('relation_one', 'relation_two') 
    ->with(['relation_three' => function ($q) { 
     $q->leftJoin(
      'schema1.model_one', 
      'table_three.id', 
      '=', 
      'model_one.object_id' 
     ) 
     ->where('object', 'Obj1'); 
    }]) 
    ->with(['relation_four' => function ($q) { 
     $q->leftJoin(
      'schema1.model_one', 
      'table_four.id', 
      '=', 
      'model_one.object_id' 
     ) 
     ->where('object', 'Obj2'); 
    }]) 
    ->get();` 

誰でもいくつかの改善またはこれを行うには、より効率的な方法を提案することができればあなただけの両方の関係をロードし、あなたのロジックで正しいものを使用することができ、私は

0

少なくとも、異なるデータベース関係を別々のフィールドに分けることをお勧めします。このようにして、コントローラ/モデルコード内のロジックを(コメントで示唆されているように)読み込んで区別することができます。

また、私はあなたがまだ行われていない場合は、モデル・レベルで接続名を定義する必要がありますね:

class Model_Two_Relation { 
    protected $connection = 'your-database-name-from-config'; 
} 

あなたはまた、結合条件を関係内の接続を指定する必要があります

$q = ModelOne::with('relation_one', 'relation_two') 
    ->whereHas('relation_three', function ($q) { 
     $q->from('resources.one')->where('object', 'Obj1'); 
    }) 
    ->whereHas('relation_four', function ($q) { 
     $q->from('resources.two')->where('object', 'Obj2'); 
    }) 
    ->get(); 

リンク:たぶんhttp://fideloper.com/laravel-multiple-database-connections

+0

接続は既にモデルレベルで定義されています。そのような結合で接続を指定するときにエラーが発生しました。 '未定義メソッドを呼び出すと\ Database \ Query \ Builder :: resource()'が表示されます。記事をリンクして読んだり、ありがとう – JonnyFoley