文档中的示例:
$posts = App\Post::whereHas('comments', function ($query) {
$query->where('content', 'like', 'foo%');
})->get();
这将查找带有至少foo
条评论的帖子。它将返回带有 all 注释的帖子模型。有没有一种方法可以限制它返回仅包含foo
的帖子模型和相关评论?
我知道以后可以在有条件的情况下遍历$posts
,但是我正在寻找通过查询生成器的解决方案。
答案 0 :(得分:2)
从文档中
https://laravel.com/docs/5.7/eloquent-relationships#constraining-eager-loads
$users = App\User::with(['posts' => function ($query) {
$query->where('title', 'like', '%first%');
}])->get();
编辑,其他答案是正确的..您应该将其添加到实际查询中,而不仅仅是像我首先建议的那样替换它:
因此,在您的示例中,它看起来像这样:
$posts = App\Post::with('comments', function ($query) {
$query->where('content', 'like', 'foo%');
})->whereHas('comments', function ($query) {
$query->where('content', 'like', 'foo%');
})->get();
您还可以在查询后添加延迟加载
$posts->load(['comments' => function ($query) {
$query->where('content', 'like', 'foo%');
}]);
编辑,@ HelenChe(原始问问者)建议的解决方案,它基本上是相同的,如果with
和wherehas
将具有相同的过滤器功能,则很有用。
$posts = Post::whereHas('comments', $filter = function ($query) {
$query->where('content', 'like', 'foo%');
})->with(['comments' => $filter])->get();
答案 1 :(得分:1)
如果您只希望带有至少foo
条评论的帖子以及这些评论。您必须结合使用这两个功能whereHas()
和with()
$posts = App\Post::whereHas('comments', function ($query) {
$query->where('content', 'like', 'foo%');
})->get();
->with('comments', function ($query) {
$query->where('content', 'like', 'foo%');
})->get();