如何使用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字段,同时用聚合函数统计每组的行数,命名为totalgroupBy('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,核心步骤都是这三个:
- 指定按
district字段进行分组 - 对每个分组执行计数聚合(统计该组的记录数量)
- 将查询结果映射为「district名称: 数量」的键值对结构
这样就能得到你期望的输出格式啦!
内容的提问来源于stack exchange,提问作者Purushotam Sangroula
相关产品推荐
相关产品推荐

