2014-01-05 138 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;