Laravel中如何对多个withCount结果求和并按该值排序
多withCount结果求和排序实现方案
完全可以通过Eloquent查询构造器实现该需求,以下是两种常用实现方式:
- 第一种:直接排序,性能最优
无需额外查询字段,直接对withCount生成的统计字段求和排序即可:
$q->withCount(['ordered', 'favorites']) ->orderByRaw('(ordered_count + favorites_count) DESC') ->get();
withCount生成的ordered_count、favorites_count属于SQL查询层面的临时字段,可直接参与运算,该写法不会产生额外的查询开销。
- 第二种:同时获取求和结果,方便后续使用
如果你需要在返回的模型实例中直接拿到求和后的总数值,可以额外定义别名查询:
$q->withCount(['ordered', 'favorites']) ->selectRaw('*, (ordered_count + favorites_count) as total_interaction') ->orderBy('total_interaction', 'DESC') ->get();
执行完成后可以直接通过模型的total_interaction属性获取两个统计值的和。
异常兼容处理
如果你的数据库环境中无关联数据时统计字段会返回NULL而非0,可以用COALESCE函数做兼容,避免求和结果为NULL:
$q->withCount(['ordered', 'favorites']) ->orderByRaw('(COALESCE(ordered_count, 0) + COALESCE(favorites_count, 0)) DESC') ->get();
内容的提问来源于stack exchange,提问作者Ashok
相关产品推荐
相关产品推荐

