【问题标题】:Paginate laravel query result分页 laravel 查询结果
【发布时间】:2020-12-31 14:10:43
【问题描述】:

我有两个模型:

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

用户有很多帖子。 Post 有很多 cmets,Comment 属于一个 Post。这很简单。

现在,如果帖子今天创建了评论,我想用它的 cmets 加载所有经过身份验证的用户的帖子。如果帖子今天没有评论,则不会加载。帖子也会分页。如何在 laravel eloquent 中构建查询?

我尝试过这样的事情:

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

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

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

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

    在上面的代码中,您将收到今天至少有一条评论的所有帖子。但是你还没有收到附在他们身上的 cmets。为此,您需要使用 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); // <---
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-08
      • 2021-09-11
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多