Laravel Eager Load with conditional statement



大家好

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

我有一个简单的查询,使用laravel的急于加载函数但是在这个急于加载函数中,我想根据某些条件获取某些注释

的例子:

use AppNews;
...
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'(获取最新评论)来排序它们,如果每个评论

没有喜欢我需要包括' likees_count '使用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'(最新的一个),如果没有类似的评论?

Thanks in advance

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

一旦你订购了收集,那么当你循环你的新闻记录时,从你的相关记录中选择第一个项目

最新更新