返回

如何在 Laravel 中从关系表中根据字段分组求和?

mysql

在 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 文档了解更多关于原始查询和分组的信息。

常见问题解答:

  1. 如何从其他字段分组?

    groupBy() 中指定不同的字段,如 groupBy('production_activities.product_type')

  2. 如何将结果分组到数组中?

    使用 groupBy() 的第二个参数,如 groupBy('production_activities.id', 'production_outputs.output_type')

  3. 如何计算其他聚合函数(如平均值、最小值)?

    使用其他聚合函数,如 DB::raw('AVG(production_outputs.output_kg) AS average_output')

  4. 如何使用子查询进行更复杂的计算?

    嵌套一个原始查询作为子查询,如 DB::raw('(SELECT SUM(output_kg) FROM production_outputs WHERE production_activity_id = production_activities.id)') AS total_output

  5. 如何从嵌套关系中求和?

    使用点符号导航嵌套关系,如 DB::raw('SUM(production_outputs.child_output_kg) AS total_output')