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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:16:35