我的ArticlesController中有方法根据请求GET参数对文章进行排序:
protected static function sortArticles(Collection $articles, string $sort_by, string $order): Collection
{
$sortBy = function ($by, $order) use ($articles) {
if ($order === 'asc') {
$method = 'sortBy';
} elseif ($order === 'desc') {
$method = 'sortByDesc';
}
return call_user_func([$articles, $method], [$by]);
};
switch ($sort_by) {
case 'title':
return $sortBy('title', $order);
break;
case 'views':
return $sortBy('views_count', $order);
break;
case 'comments':
return $sortBy(function ($article) { // This is my callback for sorting and it doesn't work as expected
return count($article->comments);
}, $order);
break;
case 'date':
return $sortBy('created_at', $order);
break;
}
}
一切正常,但是当sort_by = comments(Switch中的第3个案例)时,它只是不起作用:
(1/1)ErrorException类Closure的对象无法转换为 串
不知道为什么,由Collection实例上的call_user_func调用的sortByDesc方法不接受Closure作为它的参数并尝试将其转换为字符串。 如果我直接在Collection上调用sortBy或sortByDesc,一切正常:
case 'comments':
return $articles->sortBy(function ($article) { // Gives no errors
return count($article->comments);
});
break;
答案 0 :(得分:1)
获取模型时...添加withCount('评论')功能... as:
$articles = App\Article::with('comments')->withCount('comments')->get();
然后你可以在排序中使用comment_count ......
case 'comments':
return $sortBy('comments_count', $order);
break;
这将为您的模型添加一个包含注释计数的count属性。惯例是,它将在属性中存储计数,其中包含关系名称,后跟_count ...在您的情况下$ article-> comments_count ...
希望这对你有用......