【问题标题】:how to sort posts with average rating in laravel如何在laravel中对平均评分的帖子进行排序
【发布时间】:2021-04-14 02:26:33
【问题描述】:

我正在使用 willvincent rateable 软件包对帖子进行评分,它工作正常,并且每个帖子在每个 user_id 的评分表中都有他的评分, 所以我正在处理我想用他们的平均评分对帖子进行排序的任务,

我构建了在 phpmyadmin 上运行良好的原始 sql

SELECT *, AVG(ratings.rating) as average_rating
FROM posts
JOIN ratings ON ratings.rateable_id = posts.id
WHERE posts.user_id='2'
GROUP BY ratings.rateable_id
ORDER BY average_rating desc

但是我想把它转换成 laravel eloquent builder 的形式,我实现到现在

$postList->leftJoin('ratings', 'ratings.rateable_id', '=', 'posts.id')
            ->select(array('posts.*',
                DB::raw('AVG(rating) as ratings_average')   
                ))
            ->groupBy('posts.id')
            ->where('is_deleted','0')   
            ->orderBy('ratings_average', 'DESC')
            ->get();

其中 $postList 包含所有带有 user_id 的帖子,但没有提供来自帖子表在线 ID 的所有数据以及平均评分,请帮助

【问题讨论】:

    标签: php sql laravel eloquent


    【解决方案1】:

    在尝试将 SQL 查询转换为 laravel 的查询构建器时,请始终检查 ->toSql() 返回的内容。您只需在控制器或控制台中使用 dd 或 dump (dd($postList->.....->orderBy(...)->toSql())) 即可。

    DB::connection('mysql')
      ->table('posts')
      ->selectRaw('*, avg(ratings.rating) as average_rating')
      ->join('ratings', 'ratings.rateable_id', 'posts.id')
      ->where('posts.user_id', '2')
      ->orderBy('ratings.rateable_id')
      ->orderByDesc('average_rating')
      ->get()
    

    或者,使用模型。

    Posts::query()
      ->selectRaw('*, avg(ratings.rating) as average_rating')
      ->join('ratings', 'ratings.rateable_id', 'posts.id')
      ->where('posts.user_id', '2')
      ->orderBy('ratings.rateable_id')
      ->orderByDesc('average_rating')
      ->get()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      相关资源
      最近更新 更多