2014-01-05 144 views
4

我在使用laravel 4.1 hasWhere過濾關係時遇到問題。Laravel 4.1雄辯 - 過濾關係集合

迭代1 - 獲取的所有帖子:完成

$posts = Post::all(); 

迭代2 - 獲取的所有帖子延遲加載註釋:完成

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

迭代3 - 獲取意見和延遲加載僅帖子:完成

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

Iteration 4 - 僅獲得發表評論和延遲加載的文章:損壞的

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

print_r($posts->toArray())的輸出顯示迭代3和4的輸出完全相同。 我無法根據'comments.published' = 1的條件篩選關係。

+0

我相信問題是,你調用'在return'查詢的方法。只需調用'$ q-> where('published','=',1);'(no'return' statement),你應該很好。 – 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;