提问者:小点点

带条件语句的Laravel Eager Load


大家好

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

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

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'(最新的),如果有没有喜欢的评论?

提前谢谢


共1个答案

匿名用户

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

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

从最初的评论中复制

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

一旦你已经下令收集然后当你是循环您的新闻记录然后选择第一项从您的相关记录