2014-01-05 8 views
4

laravel 4.1 hasWhere를 사용하여 관계를 필터링하는 데 문제가 있습니다.Laravel 4.1 Eloquent - 관계 컬렉션 필터링

반복 한 - 모든 글 가져 오기 : 완료

$posts = Post::all(); 

반복이 - 게으른 부하의 의견 모든 게시물 가져 오기 : 완료

$posts = Post::with('comments')->get(); 

반복 3 - 의견과 게으른 부하 만 게시물을 가져 오기 : 완료

$posts = Post::with('comments')->has('comments')->get(); 

반복 4 - 게시 된 댓글과 지연로드가있는 게시물 만 가져 오기 : 브로큰

$posts = Post::with('comments') 
    ->whereHas('comments', function($q) { 
     return $q->where('published', '=', 1); 
    }) 
    ->get(); 

출력의 은 반복 3과 4의 출력이 완전히 동일 함을 보여줍니다. 'comments.published' = 1 조건에 따라 관계를 필터링 할 수 없습니다.

+0

나는 문제는 당신이에'return'를 호출하고 있음을 믿습니다 쿼리의 메서드는 간단히'$ q-> where ('published', '=', 1); (no return 문)을 호출하면 좋다. – Soulriser

답변

2

나는 해결책을 찾았지 만 이것이 가장 우아한 해결책이라고 확신하지는 않습니다. 따라서, 나는 이것을 더 나은 제안을 위해 열어두고 있습니다.

$posts = Post:: 
     ->whereHas('comments', function($q) 
      { 
       $q->where('published', '=', 1); 
      }) 
     ->with([ 
      'comments' => function($q) 
      { 
       $q->where('published', '=', 1); 
      }, 
      ])->get(); 

기본적으로 내 솔루션에는 웅변적인 결과 필터링과 별도로 지연로드 필터링이 포함됩니다. 필요한가? 이것을 성취 할 수있는 더 좋은 방법이 있습니까?

+0

with 섹션에는 두 번째 필터가 필요하지 않습니다. 이렇게하면 (이미) 필터링 된 값에 대한 필터로 두 번째 쿼리가 수행됩니다. 기본적으로 필터를 사용하는 쿼리와 필터를 다시 사용하는 다른 쿼리 (열심히로드 한 쿼리)가 기본적으로 수행됩니다. 단순히'with ('comments')'를 호출하면이 경우 트릭을 수행해야합니다. –

0

그것은 그래서 여기뿐만 아니라이 알아낼 걸 렸어요 나를 위해 작동 것입니다 .. 물론

$postsFilter = Comments::with('Posts')->where('published', 1)->first(); 
$posts= $postsFilter ->posts; 

것은 요 모델 정의에 belongsToOne 또는 belongToMany과 결합해야합니다. // 그리고 경우 누구라도 읽고

은 또한 당신이 '와'에 폐쇄를 전달할 수있는 사전 필터링 된 데이터를 사용하고자

$usersFilter = Addresses::with(array('Users' => function($query) use ($keyword){ 
    $query->where('somefield', $keyword); 
}))->where('town', $keyword)->first(); 
$myUsers = $usersFilter->users;