分页laravel查询结果

时间:2020-09-13 18:50:37

标签: laravel eloquent

我有两个模型:

  1. 用户
  2. 发布
  3. 评论

用户有很多帖子。帖子有很多评论,评论属于帖子。那很简单。

现在,如果帖子已经创建了评论,那么我现在想用其评论加载所有经过身份验证的用户的评论。如果该帖子今天没有评论,则不会被加载。这些帖子也会被分页。如何在laravel中雄辩地建立查询?

我尝试过这样的事情:

Auth::user()->posts->load(['comments' => function($query) {
                $query->where('created_at',Carbon::today());
            }]);

1 个答案:

答案 0 :(得分:2)

查询中的问题是您已经在执行它。检查这部分:

Auth::user()->posts->...
            ^^^^^^^^

您正在作为属性访问该关系。执行此操作时,查询已在执行。您需要做的是在执行查询之前限制结果。为此,请访问关系,但要作为一个函数,通过这种方式,您将收到查询生成器的实例,以在执行查询之前应用所有约束(在此示例中为->get())。 To limit a relationship with conditions, you can make use of the whereHas()

$posts = Auth::user()->posts()->whereHas(['comments' => function($query) {
        $query->where('created_at', '>=', today());
    }])
    ->get();

在上面的代码中,您今天将收到所有带有至少一条评论的帖子。但是您尚未收到附加的评论。为此,您需要使用with()方法来加载关系。

$posts = Auth::user()->posts()->whereHas('comments', function($query) {
        $query->where('created_at', '>=', today());
    })
    ->with('comments') // <--
    ->get();

应该这样做。但是鉴于您需要分页的元素,请将get()paginate()方法交换:

$posts = Auth::user()->posts()->whereHas('comments', function($query) {
        $query->where('created_at', '>=', today());
    })
    ->with('comments')
    ->paginate(15); // <---