2016-01-28 16 views
7

laravel 5.1でhasManyThrough関係を使用しようとしていますが、sqlクエリでは使用されている各モデルごとに接続ごとに定義された適切な接頭辞を使用していません。 私は3つのモデルがあり、そのうちの2つは同じ接続を使用し、そのうちの1つは異なるモデルを使用します。接続の唯一の違いは、データベースの接頭辞が同じであることです。laravelでhasManyThrough関係を使用するモデルのDB接続が異なる5.1

:モデルAモデルBは接頭辞を使用する接続B B_が
  • モデルCプレフィックスB_を使用する接続B
  • 関係を有している

  • プレフィックスA_を使用する接続有する

    • モデルBの内部:

      public function relationshipWithA() 
      { 
          return $this->hasManyThrough(A::class, C::class, 'Cid', 'Aid'); 
      } 
      

      最終的なクエリロジックは正しいですが、結合されたテーブルのB_プレフィックスを使用する代わりに、クエリのすべてのテーブルのA_プレフィックスを使用します。

      これはlaravelのバグ/制限ですか?これには解決策がありますか、私は何をしたいのかを達成するために手動で参加する必要がありますか?

      public function foos() 
      { 
          return $this->belongsToMany(Foo::class, 'other_db.foos'); 
      } 
      

      しかしhasManyThroughは、その署名で$tableパラメータを持っていないため、同じソリューションは適用されない:

  • +0

    laravelモデルでは、関係の異なる接続では機能しません。なぜなら、雄弁は舞台裏でSQL結合を使用し、複数のDB接続では不可能なからです – AfikDeri

    答えて

    1

    その他の関係タイプは、複数のデータベース接続で動作します。しかし、

    あなたはこのような不完全な回避策を行うことができます

    :(それは別の戻り値型であるので)それはまったく同じ機能を提供していません

    public function bars() 
    { 
        return $this->belongsToMany(Bar::class, 'other_db.bars'); 
    } 
    
    public function foos() 
    { 
        $barIds = $this->bars->pluck('id'); 
        return Foo::whereIn('bar_id', $barIds); 
    } 
    

    を、しかし満たしより単純な目的のための目的。

    必要であれば、あなたもこのような何か実行して構文のいくつかのより多くを複製することができます。

    protected $appends = [ 
        'foos', 
    ]; 
    
    /** 
    * @return Foo[] 
    */ 
    public function getFoosAttribute() 
    { 
        return $this->foos()->get(); 
    } 
    

    をあなたはまだあなたのようなあなたのコードでそれを使用することができますこの方法を定期的に持つほとんどの時間ですrelation(意味は$this->foos()->get()の代わりに$this->foosを使用できます)

    関連する問題