Laravel 6 如何按关联外键表likes的总记录数进行降序排序
解决方案
你可以使用 Laravel Eloquent 提供的 withCount 方法实现需求,该方法会自动统计指定关联的记录数,并且支持直接基于统计结果排序,写法如下:
$facts = \App\Fact::with(['likes', 'dislikes']) ->withCount('likes') ->orderBy('likes_count', 'desc') ->paginate(25);
说明
withCount('likes')会为每个查询返回的 Fact 模型实例新增likes_count属性,属性值为当前 Fact 关联的 Likes 表总记录数,全程仅通过1次子查询实现统计,不会产生N+1性能问题- 如果你同时需要统计dislikes的数量,可修改为
withCount(['likes', 'dislikes']),会同步生成dislikes_count属性供你直接调用 - 该方法兼容 Laravel 5.2 及以上版本,你的 Laravel 6 环境可直接使用无需额外适配
如果你倾向于手动写关联查询实现,也可以用 leftJoin 的写法,效果一致:
$facts = \App\Fact::selectRaw('facts.*, COUNT(likes.id) AS likes_count') ->leftJoin('likes', 'likes.fact_id', '=', 'facts.id') ->groupBy('facts.id') ->with(['likes', 'dislikes']) ->orderBy('likes_count', 'desc') ->paginate(25);
注意:如果你的数据库开启了严格模式(ONLY_FULL_GROUP_BY),手动join写法需要调整groupBy参数或修改查询字段,否则可能触发SQL报错,更推荐使用第一种withCount方案
内容的提问来源于stack exchange,提问作者Amorok
相关产品推荐
相关产品推荐

