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

Laravel中如何关联加载模型并计算多列数据求和?

Laravel 同时加载关联模型并计算总分的解决方案

方案一:子查询+关联预加载(数据库层面计算)

直接在查询时同时预加载关联模型,并通过子查询计算总分,保证一次查询完成所有需求,性能更优:

public function getrecord()
{
    $students = Student::with('Record')
        ->addSelect([
            'total_marks' => Record::whereColumn('student_id', 'students.id')
                ->selectRaw('SUM(Math + Eng + Urdu) as total_marks')
        ])
        ->get();

    return $this->success($students);
}

代码说明:

  • with('Record'):预加载每个学生对应的所有成绩记录,避免N+1查询问题
  • addSelect:给Student模型额外添加total_marks字段,通过子查询统计该学生所有成绩记录中三门科目分数的总和
  • 注意模型名使用大写Record,whereColumn中关联的表字段要和实际表名对应(Student模型默认对应students表)

方案二:模型访问器(内存层面计算)

如果数据量不大,可通过定义模型访问器的方式,在关联加载完成后计算总分,代码更简洁:

首先在Student模型中添加访问器:

// Student 模型文件
public function getTotalMarksAttribute()
{
    // 遍历当前学生的所有成绩记录,计算每一条记录的三门科目总分后求和
    return $this->Record->sum(function ($record) {
        return $record->Math + $record->Eng + $record->Urdu;
    });
}

然后查询时直接预加载关联即可:

public function getrecord()
{
    $students = Student::with('Record')->get();
    // 每个学生实例可通过 $student->total_marks 获取总分
    return $this->success($students);
}

两种方案对比:

  • 子查询方案:适合数据量大的场景,所有计算在数据库完成,性能更高
  • 访问器方案:代码更直观,无需编写复杂查询,适合数据量较小的场景

内容的提问来源于stack exchange,提问作者Arbaz Khalid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:05:26