约束在 whereHas 上返回哪些关系模型



文档中的示例:

$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(原始提问者(建议的解决方案,它基本上是相同的,如果withwherehas将具有相同的过滤功能,则很有用。

$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();

相关内容

  • 没有找到相关文章

最新更新