2017-09-24 4 views
0

私にはNetflix-esque(階層的な意味で)のモデルがあります。一例として、私は、belongsToManyグループであるbelongsToManyサブグループであるbelongsToMany Course、belongsToManyコレクションのレッスンを持っています。レッスンは最下位レベルで、グループまでは最上位レベルです。チェーンを下って行くと、それぞれが次のリンクのbelongsToManyも同様にダウンします。階層的なbelongsToMany関係からすべてのデータを返します。Laravel 5.3

私はWordpressから私のLaravel APIを呼び出すフィルタボタンを使用しています。グループIDとサブグループIDを渡すと、そのサブグループに属するコレクションを返す必要があります。しかし、私が必要とするのは次のようなものです:

$group->with('subgroups')->where('subgroup_id')->with('collections')->with('courses')->with('lessons'); 

しかし、この種の構文は機能しません。各レベルをクエリしてそのレベルの関係を取得する方法はありますか?

もっとコードが必要な場合は、もっと分かち合うことができます。

+0

あなたの予想される出力は何ですか?ちょうど 'コレクション'ですか?または完全な階層? – fubar

+0

あなたの例では '$ group'とは何ですか? – fubar

+0

@fubar、私の期待される出力は、コースの配列を持つ各コレクションオブジェクトです。各コースオブジェクトには、関連するレッスンの配列があります。 $ groupは、私のルートから渡されたGroup :: find($ id)の変数を参照するだけです。 – ryanpback

答えて

1

以下はテストされていませんが、すぐに作業するか、自分で問題を解決する方法について考えてください。

カップルのポイント:

  1. あなたwithコール内の連鎖関係することができます。例えば。 courses.lessonsはについてはcoursesと関連するlessonsが見つかります。
  2. whereHasを使用すると、関係をクエリできます。この例では、渡されたサブグループIDと一致するサブグループと、渡されたグループIDと一致するグループも持つ、すべてのコレクションを探しています。

例:

$groupId = 123; 
$subgroupId = 456; 

$collections = Collection::with('courses.lessons') 
    ->whereHas('subgroup', function ($query) ($groupId, $subgroupId) { 
     return $query->whereHas('group', function ($query) use ($groupId) { 
       return $query->where('id', $groupId); 
      }) 
      ->where('id', $subgroupId); 
    }) 
    ->get(); 
+0

ありがとうございました!私はこの答えを正しいものとしてマークしました。それは少し遊んだが、私はそれを得た。 ここでは、これを動作させるために使用したコードを示します。 $ collections =コレクション( 'courses.lessons') - > whereHas( 'subgroups'、function($ query)use($ subgroupId、$ groupId){ return $ query-> whereHas ( 'subgroup_id'、$ subgroupId); })> get($ groupId);>(get group()); function($ query) ); – ryanpback

関連する問題