返回
如何在 Laravel 中从关系表中根据字段分组求和?
mysql
2024-03-19 02:52:43
在 Laravel 中从关系表字段中分组求和
问题:
如何从 Laravel 中的关系表中获取字段的总和,同时根据另一个字段分组?
解决方案:
withSum()
函数虽然可以从关系表中求和,但不能直接用于分组求和。因此,我们需要使用 Laravel 的原始查询功能:
$result = ProductionActivity::select('production_activities.id', DB::raw('SUM(production_outputs.output_kg) AS total_output'))
->leftJoin('production_outputs', 'production_activities.id', '=', 'production_outputs.production_activity_id')
->groupBy('production_activities.id')
->get();
关键步骤:
- 选择要显示的字段(
production_activities.id
)和计算的总和字段(DB::raw('SUM(production_outputs.output_kg) AS total_output')
)。 - 使用
leftJoin()
连接主表和关系表。 - 使用
groupBy()
根据所需字段分组结果。 - 最后,使用
get()
获取结果集。
好处:
- 灵活:允许根据不同的字段分组和求和。
- 扩展性:适用于各种关系和查询场景。
提示:
- 确保表之间存在适当的关联。
- 使用
dd($result)
检查结果集。 - 查阅 Laravel 文档了解更多关于原始查询和分组的信息。
常见问题解答:
-
如何从其他字段分组?
在
groupBy()
中指定不同的字段,如groupBy('production_activities.product_type')
。 -
如何将结果分组到数组中?
使用
groupBy()
的第二个参数,如groupBy('production_activities.id', 'production_outputs.output_type')
。 -
如何计算其他聚合函数(如平均值、最小值)?
使用其他聚合函数,如
DB::raw('AVG(production_outputs.output_kg) AS average_output')
。 -
如何使用子查询进行更复杂的计算?
嵌套一个原始查询作为子查询,如
DB::raw('(SELECT SUM(output_kg) FROM production_outputs WHERE production_activity_id = production_activities.id)') AS total_output
。 -
如何从嵌套关系中求和?
使用点符号导航嵌套关系,如
DB::raw('SUM(production_outputs.child_output_kg) AS total_output')
。