带条件语句的Laravel Eager Load

带条件语句的Laravel Eager Load,laravel,eloquent,sql-order-by,laravel-relations,Laravel,Eloquent,Sql Order By,Laravel Relations,大家好 我是拉威尔的新手,目前正在用它构建我的第一个简单新闻应用程序 我有一个简单的查询,它使用了laravel的渴望加载函数 但是在这个急切的加载函数中,我想根据一些条件获取某些注释 例如: use App\News; ... public function home() { $news = News::with([ 'thumbnail', 'source', // link to real news

大家好

我是拉威尔的新手,目前正在用它构建我的第一个简单新闻应用程序

我有一个简单的查询,它使用了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')
然后按降序排列

public function home() {
    $news = News::with([
        'thumbnail',
        'source',
        '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”(最新的一个)将回退查询按顺序排列评论


提前感谢

您当前的方法看起来很适合按喜欢次数对结果进行排序,如果没有喜欢,您仍然可以通过在列添加另一个带有创建的
的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个喜欢,那么最新的一个会首先出现在列表中,同样,如果评论有喜欢,那么它们也会首先按照喜欢计数排序,然后按照创建时间排序


一旦您对收藏进行了排序,然后在循环新闻记录时,从相关记录中选择第一个项目

添加另一个在desc创建的订单,这样,如果所有评论都有0个喜欢,则最新的一个将首先出现在列表中,如果评论有喜欢,则使用created atYou Was right对它们进行排序,感谢您的指点,我必须放置两个查询orderBy(),一个是likes\u count,另一个是在
$query->orderBy('likes\u count',DESC')->first()处创建的
$query->orderBy('created_at','DESC')->first()我已经通过多次删除和恢复评论上的喜欢来测试它,并且它工作正常,顺便说一句,你打算回答我的问题吗?如果是的话,我会把你的答案标记为正确答案,否则我会再回答一遍,谢谢你,顺便问一下,我有一个简单的问题,把这些问题放在一起,然后把它们分成两行有什么区别吗?@ChristianDelvianto没有;没什么区别,在同一条线上做基本上叫做方法chaining@ChristianDelvianto我已经用
First()更新了我的答案
将只为一条新闻返回一条评论,因此您需要加载所有评论,这些评论按照在和显示新闻时创建的类似计数排序,然后从排序的评论集合中选择第一条记录,cheers