约束哪些关系模型在何处返回

时间:2018-10-21 10:02:45

标签: laravel laravel-5 eloquent

文档中的示例:

$posts = App\Post::whereHas('comments', function ($query) {
    $query->where('content', 'like', 'foo%');
})->get();

这将查找带有至少foo条评论的帖子。它将返回带有 all 注释的帖子模型。有没有一种方法可以限制它返回仅包含foo的帖子模型和相关评论?

我知道以后可以在有条件的情况下遍历$posts,但是我正在寻找通过查询生成器的解决方案。

2 个答案:

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

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