You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:09:02