2017-09-24 5 views
0

Netflix-esque (계층 적 의미의 모델)입니다. 예를 들어, belongsToMany Course는 belongsToMany 그룹 인 belongsToMany Subgroup에 속하는 많은 Collection의 belongsToMany Course를 가지고 있습니다. 레슨은 가장 낮은 레 벨이며 최상위 레벨은 Group입니다. 체인을 내려가고, 각각 다음 링크의 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.lessonscollections에 대해 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 = Collection :: with ('courses.lessons') -> whereHas ('subgroups', function ($ query) use ($ subgroupId, $ groupId)) { return $ query-> whereHas ('groups' ('subgroup_id', $ subgroupId);> }) -> get (())을 사용하여 함수 ($ query)를 사용하면 ($ groupId) { return $ query-> where ('group_id', $ groupId); }); – ryanpback