【问题标题】:Order articles by average article rating按平均文章评分排序文章
【发布时间】:2019-10-08 20:21:00
【问题描述】:

我希望能够根据我使用以下查询解决的评分来订购我的文章:

return Article::where('private', 0)
    ->whereIn('movie_id', $movie)
    ->with(['user', 'movie', 'ratings'])
    ->withCount(['ratings as average' => function ($query) {
        $query->select(\DB::raw('coalesce(avg(value), 0)'));
    }])
    ->orderByDesc('average')
    ->paginate(10);

但问题是,如果一篇文章只有 1 或 2 个评分/投票,并且它们都是正面评分,那么该文章将与其他具有更多评分/投票的顶级文章一起排名,这会给出不准确的结果。我如何将其限制为仅获得超过 5 票的文章?还有其他更好的解决方案吗?

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    如果ratings是一个关系hasMany,你可以简单地使用:

    return Article::where('private', 0)
             ->has('ratings', '>=', 5)
             ...
    

    仅获取评分为 5 或更多的文章。

    您也可以在查询中获取所有文章,包括评分数:

    return Article::where('private', 0)
             ->withCount('ratings')
             ...
    

    您可以在循环中使用一个简单的条件来仅显示评级为 5 或更多的文章的评级:

    @foreach ($articles as $article)
         @if ($article->count_ratings >= 5)
              // show rating 
         @endif
    @endforeach
    

    【讨论】:

    • 你是对的,这是一个 hasMany 关系。您是否知道在这种情况下,投票数少于 5 的其他文章的标准程序是什么?在这种情况下,它们根本不会出现。
    • 是的,我认为您应该使用原始查询和子查询来获得带有条件的 AVG 评级。或者,抓取所有文章,并在循环中测试计数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多