我在使用laravel 4.1 hasWhere过滤关系时遇到问题。
迭代1 - 获取所有帖子:完成
$posts = Post::all();
迭代2 - 获取所有帖子延迟加载评论:完成
$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();
print_r($posts->toArray())
的输出显示迭代3和4的输出完全相同。
我无法根据'comments.published' = 1
。
答案 0 :(得分:2)
我找到了解决方案,但我不确定这是最优雅的解决方案。因此,我将这一点公开以获得更好的建议。
$posts = Post::
->whereHas('comments', function($q)
{
$q->where('published', '=', 1);
})
->with([
'comments' => function($q)
{
$q->where('published', '=', 1);
},
])->get();
基本上,我的解决方案包括过滤雄辩的结果,并分别过滤延迟加载。这有必要吗?有没有更好的方法来实现这一目标?
答案 1 :(得分:0)
我花了一段时间才弄清楚这一点,所以这对我有用..
$postsFilter = Comments::with('Posts')->where('published', 1)->first();
$posts= $postsFilter ->posts;
当然你必须在模型定义中与belongsToOne或belongsToMany绑定。
//如果有人阅读也希望使用预过滤数据,你可以将一个闭包传递给'with'
$usersFilter = Addresses::with(array('Users' => function($query) use ($keyword){
$query->where('somefield', $keyword);
}))->where('town', $keyword)->first();
$myUsers = $usersFilter->users;