文档中的示例:
$posts = AppPost::whereHas('comments', function ($query) {
$query->where('content', 'like', 'foo%');
})->get();
这将查找至少有一个带有foo
评论的帖子。它将返回包含所有注释的帖子模型。有没有办法限制它返回只有foo
的帖子模型和相关评论?
我知道我们稍后可以使用条件循环$posts
,但如果可能的话,我正在通过查询构建器寻找解决方案。
从文档中:
https://laravel.com/docs/5.7/eloquent-relationships#constraining-eager-loads
$users = AppUser::with(['posts' => function ($query) {
$query->where('title', 'like', '%first%');
}])->get();
编辑,另一个答案是正确的..您应该将其添加到实际查询中,而不是像我首先建议的那样替换它:
因此,从您的示例中,它看起来像这样:
$posts = AppPost::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();
如果您只想要至少有一个评论的帖子,foo
这些评论。 您必须将这两个功能结合起来,whereHas()
和with()
$posts = AppPost::whereHas('comments', function ($query) {
$query->where('content', 'like', 'foo%');
})->get();
->with('comments', function ($query) {
$query->where('content', 'like', 'foo%');
})->get();