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

如何使用Laravel ORM实现groupBy与count分组统计功能?

用ORM实现按District统计地址行数的方案

嘿,我明白你要的是用ORM替代原生SQL来统计不同district对应的记录数,最终输出指定的键值对数组格式对吧?这其实很简单,核心就是利用ORM的分组查询和聚合统计功能,下面我给你举几个常见ORM的实现例子:

Laravel Eloquent 实现

假设你的模型类是Address(对应数据库的address表),可以这样写:

use App\Models\Address;
use Illuminate\Support\Facades\DB;

// 执行分组统计并转换为目标数组
$districtCounts = Address::select('district', DB::raw('count(*) as total'))
    ->groupBy('district')
    ->pluck('total', 'district')
    ->toArray();

这段代码的逻辑:

  • select('district', DB::raw('count(*) as total')):指定要查询的district字段,同时用聚合函数统计每组的行数,命名为total
  • groupBy('district'):按district字段分组,确保每个district只统计一次
  • pluck('total', 'district'):直接将查询结果转换为以district为键、total为值的集合
  • toArray():把集合转成你需要的普通数组格式,输出就会是你想要的["Kathmandu"=>4, "Bhaktapur"=>1, "Jhapa"=>1]

Django ORM 实现

如果是用Django框架,对应的代码如下:

from django.db.models import Count
from yourapp.models import Address

# 执行分组统计
district_queryset = Address.objects.values('district').annotate(total=Count('id')).order_by()
# 转换为目标字典/数组格式
district_counts = {item['district']: item['total'] for item in district_queryset}

逻辑说明:

  • values('district'):告诉ORM按district字段分组
  • annotate(total=Count('id')):给每个分组添加一个total字段,值为该组的记录数(用id统计是因为主键不会为空,统计更准确)
  • order_by():去掉默认的排序,提升查询效率
  • 最后用字典推导式把查询集转成你需要的键值对结构

通用思路(适用于其他ORM)

不管你用的是哪种ORM,核心步骤都是这三个:

  1. 指定按district字段进行分组
  2. 对每个分组执行计数聚合(统计该组的记录数量)
  3. 将查询结果映射为「district名称: 数量」的键值对结构

这样就能得到你期望的输出格式啦!

内容的提问来源于stack exchange,提问作者Purushotam Sangroula

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:54:51