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

Laravel查询分组问题求助:实现区域分组与审计数据聚合以生成图表

问题排查与解决方案

核心问题分析

  • 重复select覆盖字段:代码里先后调用两次select(),第二次的select('data_audit', 'esito')会完全覆盖第一次的字段选择,导致最终结果里缺失分组依赖的master_zone、subarea、microarea字段。
  • 未做聚合处理:按三个字段分组后,每组对应多条审计记录,直接查询data_audit和esito会触发数据库分组规则报错(除非关闭严格模式,这不是合规做法),必须对这两个字段做聚合处理。

修正后的查询方案

方案1:原生聚合函数实现(适配MySQL)

$audit = DB::table('esiti_audit')
    ->where('employee', $name)
    ->select(
        'master_zone',
        'subarea',
        'microarea',
        DB::raw('GROUP_CONCAT(data_audit ORDER BY data_audit DESC SEPARATOR ",") as audit_dates'),
        DB::raw('GROUP_CONCAT(esito ORDER BY data_audit DESC SEPARATOR ",") as audit_results')
    )
    ->groupByRaw('master_zone, subarea, microarea')
    ->orderByDesc('MAX(data_audit)') // 按分组内最新审计日期排序
    ->get();
  • 用GROUP_CONCAT把每组的审计日期、结果拼接成字符串,后续可通过explode()转成数组用于图表渲染
  • 排序时用MAX(data_audit)确保按分组内最新的审计日期降序排列

方案2:Laravel集合分组(保留原始数据结构)

如果不想用原生聚合,可先查询全量数据再用集合分组:

$auditRecords = DB::table('esiti_audit')
    ->where('employee', $name)
    ->select('master_zone', 'subarea', 'microarea', 'data_audit', 'esito')
    ->orderByDesc('data_audit')
    ->get();

$groupedAudit = $auditRecords->groupBy(function ($item) {
    return $item->master_zone . '|' . $item->subarea . '|' . $item->microarea;
})->map(function ($group) {
    return [
        'master_zone' => $group->first()->master_zone,
        'subarea' => $group->first()->subarea,
        'microarea' => $group->first()->microarea,
        'audit_dates' => $group->pluck('data_audit')->toArray(),
        'audit_results' => $group->pluck('esito')->toArray()
    ];
});
  • 先拉取所有符合条件的记录,再通过集合groupBy按三个字段的组合值分组
  • 用pluck直接提取每组的日期和结果数组,可直接用于图表数据组装

关键注意事项

  • 保持数据库严格模式开启(默认状态),分组查询的select字段必须要么在groupBy中,要么是聚合函数处理后的字段
  • 若使用GROUP_CONCAT,注意MySQL默认有字符串长度限制,数据量大时需调整group_concat_max_len配置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 06:28:34