为什么回调不能用于排序?

时间:2017-11-11 14:07:54

标签: php laravel

我的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;

1 个答案:

答案 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 ...

希望这对你有用......