2016-12-25 8 views
4

Laravelドキュメントは、hasManyThrough宣言が2つのレベル「深い」関係にしか使用できないことを示しているようです。もっと複雑な関係はどうですか?たとえば、Userには、多くの場合、Subjectがあり、そのそれぞれは、多くの場合、Deckで、多くはです。 Userに属するすべてのDeckは、hasManyThrough宣言を使用して取得するのは簡単ですが、Userに属するすべてのCardはどうなりますか?より深い関係にhasManyThroughを適用する

+0

[私はこの同じ質問をしました](http://stackoverflow.com/questions/25938081/distant-hasmanythrough)数年前です。 HasManyThroughは単なるショートカットです。現存するように、離れた関係にアクセスするための仕組みは組み込まれていません。 – maiorano84

答えて

1

コメントに記載されているとおり、hasManyThroughはこのレベルの特異性をサポートしていません。私たちは、Cards -> Decks -> Subjectsからつもり

//App\User; 

public function cards() 
{ 
    Card::whereHas('decks', function($q){ 
     return $q->whereHas('subjects', function($q){ 
      return $q->where('user_id', $this->id); 
     }); 
    }); 
} 

:あなたができることの一つは、反対方向に行くクエリビルダインスタンスを返すことです。 subjectsには、user_idの列が必要です。

ユーザーモデルから呼び出された場合、それはthussly行われることになります。

$user->cards()->get(); 
0

まあ、実際には最善の解決策は、カードの表に余分な列配置されます - あなたが取得するので、頻繁なニーズを持っている場合、USER_IDをユーザーのためのすべてのカード。

Laravelは2深度関係のHas-Many-Through関係を提供します。これは非常によく使用される関係であるためです。 Laravelがサポートしていない関係については、あなた自身で最良のテーブル関係を把握する必要があります。

あなたの目的のために、次のコードスナップを使用して、現在のリレーションモデルで、ユーザーのすべてのカードを取得できます。

public function decks() 
    { 
     return $this->hasManyThrough('Deck', 'Subject'); 
    } 
  • デッキ時間:

    昇天

    • ユーザーは、だから、プロジェクトのモデルは、次のコードを持っています

    、デッキにhasManyThough関係を持っていますカード

  • から hasMany関係

としてコード

$deck_with_cards = $user->decks()->with("cards")->get(); 
$cards = []; 
foreach($deck_with_cards AS $deck) { 
    foreach ($deck->cards as $c) { 
    $cards[] = $c->toArray(); 
    } 
} 

は今$cards$userのためのすべてのカードを持っています。

関連する問題