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
相关产品推荐
相关产品推荐

