带有条件语句的 Laravel Eager Load

问题描述

大家好

我是 Laravel 的新手,目前正在用它构建我的第一个简单的新闻应用

我有一个简单的查询,使用 laravel 的预先加载功能 但是在这个急切加载功能中,我想根据某些条件获取某些评论

示例:

use App\News;
...

public function home() {
    $news = News::with([
                    'thumbnail','source',// link to real news source
                    'comments' => function ($query) {
                        // fetch a comment where likes > 0,otherwise,get latest comment
                        // *get only one*
                    }
                ])->paginate(5);

    return response()->json([
        'news' => $news
    ]);
}

如何做到这一点?

更新

我找到了一种按赞数排序评论方法但如果每个评论中没有赞,我不知道如何按“created_at”(获取最新评论)排序

我需要使用 withCount('likes') 包含“likes_count” 然后按降序排列

public function home() {
    $news = News::with([
        'thumbnail','comments' => function ($query) {
            $query->withCount('likes');
            $query->orderBy('likes_count','DESC')->first();

            // return the first comment that has likes or most liked comment
        }
    ])->paginate(5);

    ...
}

如果评论中没有赞,现在如何将回退查询按“created_at”(最新的)排序?

提前致谢

解决方法

您当前的方法看起来很适合按喜欢计数对结果进行排序,如果没有喜欢,您仍然可以通过添加另一个带有 created_at 列的 order by 子句获得最新记录

$news = News::with([
    'thumbnail','source','comments' => function ($query) {
        $query->withCount('likes');
        $query->orderBy('likes_count','DESC')
              ->orderBy('created_at','DESC');
    }
])->paginate(5);

从最初的评论复制

因此,如果所有评论都有 0 个赞,则最新的评论将首先出现在列表中,同样,如果评论有赞,则它们也首先按赞数排序,然后按创建时间排序。

一旦您订购了收藏,然后在循环新闻记录时从相关记录中选择第一项