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

如何在PHP foreach循环中整合第三段SQL查询的device_id数据?

解决方案

步骤1:预构建设备ID映射表

先把tb_device_gate_record的数据按vip_id做索引,方便后续快速匹配,避免循环嵌套导致性能损耗:

// 假设已从tb_device_gate_record查询到数据并存入$gateRecords数组
$deviceMap = [];
foreach ($gateRecords as $gateItem) {
    // 以vip_id为键,存储对应的device_id
    $deviceMap[$gateItem['vip_id']] = $gateItem['device_id'];
}

步骤2:在循环中整合device_id

遍历生成masterlist和sublist时,通过员工的id(对应gate表的vip_id)直接从映射表中取device_id:

// 假设遍历员工信息的主循环
foreach ($employeeList as $emp) {
    // 生成masterlist项
    $masterlist[] = [
        'id' => $emp['id'],
        'name' => $emp['name'],
        'department' => $emp['department'],
        // 匹配device_id,无对应值则设为null或空字符串
        'device_id' => $deviceMap[$emp['id']] ?? null,
        // 其他原有字段...
    ];

    // 生成sublist项(假设关联了考勤记录)
    foreach ($empAttRecords[$emp['id']] as $att) {
        $sublist[] = [
            'emp_id' => $emp['id'],
            'att_time' => $att['record_time'],
            'status' => $att['status'],
            'device_id' => $deviceMap[$emp['id']] ?? null,
            // 其他原有字段...
        ];
    }
}

可选优化:SQL层面直接关联

如果业务允许,也可以直接在SQL查询时关联三张表,减少PHP端的处理逻辑:

SELECT 
    ei.id, ei.name, ei.department,
    ar.record_time, ar.status,
    gdr.device_id
FROM tb_employees_info ei
LEFT JOIN tb_att_record ar ON ei.id = ar.emp_id
LEFT JOIN tb_device_gate_record gdr ON ei.id = gdr.vip_id

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:18:13