Laravel Eloquent按关联模型Service分组求和问题
解决按Service分组统计交易总金额的问题
我明白你遇到的困扰啦——直接用job.service_id分组肯定行不通,因为Eloquent的with()只是预加载关联模型,并不会把关联表的字段合并到主查询结果里,数据库根本找不到这个字段。给你两个简单可行的方案:
方案一:通过关联表Join实现(性能更优)
直接把Transaction和Job表关联起来,这样就能拿到Job表里的service_id,接着分组统计总金额:
use Illuminate\Support\Facades\DB; $stats = Transaction::join('jobs', 'transactions.job_id', '=', 'jobs.id') ->select( 'jobs.service_id', DB::raw('SUM(transactions.your_amount_column) as total_value') ) ->groupBy('jobs.service_id') ->get();
注意:把
your_amount_column替换成你Transaction表中存储金额的实际字段名哦~
执行这个查询后,你会得到一个集合,每个元素刚好包含service_id和total_value,完全匹配你想要的输出格式。之后不管是遍历使用,还是转成数组,都很方便,后续再去Services表查询服务名称也毫无阻碍。
方案二:使用Eloquent关联子查询(更贴合ORM风格)
如果你不想用Join,也可以通过子查询的方式,在Transaction查询中引入对应的service_id:
use Illuminate\Support\Facades\DB; $stats = Transaction::select( DB::raw('(SELECT service_id FROM jobs WHERE jobs.id = transactions.job_id) as service_id'), DB::raw('SUM(transactions.your_amount_column) as total_value') ) ->groupBy('service_id') ->get();
这个方案不需要关联表,而是通过子查询逐个获取当前Transaction对应的Job的service_id,同样能实现分组统计。不过数据量大的话,Join的性能会更优,更推荐方案一。
为什么原来的写法会报错?
你之前用的Transaction::with('job')->groupBy('job.service_id'),with('job')只是告诉Eloquent要预加载每个Transaction对应的Job模型,但主查询还是只操作Transaction表,数据库层面根本不存在job.service_id这个字段,自然会抛出错误啦~
内容的提问来源于stack exchange,提问作者Dev.W
相关产品推荐
相关产品推荐

