Laravel中如何将两个不同长度的数组合并为含缺勤、请假统计的新数组
实现方案
方案1:优化SQL查询(更推荐,仅需一次数据库请求)
两个查询逻辑高度相似,仅vacs字段筛选条件不同,可以直接通过条件聚合一次拿到目标结果,无需后续二次处理:
$statistics = Absence::query() ->select('name') ->selectRaw("SUM(CASE WHEN vacs = 'No' THEN 1 ELSE 0 END) as abs_counts") ->selectRaw("SUM(CASE WHEN vacs = 'yes' THEN 1 ELSE 0 END) as vac_counts") ->whereBetween('date', [$req->from, $req->to]) ->where('stage', $req->stage) ->where('group', $req->group) ->where('subject', $req->subject) ->groupBy('name') ->get();
直接输出的$statistics就和你期望的格式完全一致。
方案2:合并已有的两个查询结果
如果不想修改原有查询逻辑,可以用Laravel集合的内置方法快速合并处理:
// 分别将两个统计结果转为以姓名为键的映射结构 $absMap = $absences->keyBy('name'); $vacMap = $vacs->keyBy('name'); // 收集所有出现过的姓名(自动去重) $allNames = $absMap->merge($vacMap)->keys(); // 遍历生成最终统计数组 $finalResult = $allNames->map(function ($name) use ($absMap, $vacMap) { return [ 'name' => $name, 'abs_counts' => $absMap->get($name)?->counts ?? 0, 'vac_counts' => $vacMap->get($name)?->counts ?? 0, ]; })->values()->toArray();
如果你的PHP版本低于8.0不支持空安全运算符?->,可以把对应行改为:
'abs_counts' => isset($absMap[$name]) ? $absMap[$name]->counts : 0, 'vac_counts' => isset($vacMap[$name]) ? $vacMap[$name]->counts : 0,
内容的提问来源于stack exchange,提问作者Sermed mayi
相关产品推荐
相关产品推荐

