CodeIgniter关联两数据库表结果 按id_barang分组为子数组
问题根因
原有循环逻辑存在3个核心错误:
- 循环过程中直接覆盖商品原始字段,
nama_barang、merk等基础信息完全丢失 - 关联价格时未校验
id_barang是否匹配,所有价格数据会被反复覆盖 - 未处理无对应价格的商品,也没有按照要求生成数字索引的结果结构,最终只输出了有价格的2条记录
正确实现代码
先把价格数据按商品ID提前分组(比嵌套双重循环效率更高,数据量越大优势越明显),再遍历商品列表挂载对应价格子集即可:
// 第一步:将价格数据按关联的商品ID分组 $groupedHarga = []; foreach ($harga as $hargaItem) { $groupedHarga[$hargaItem['id_barang']][] = $hargaItem; } // 第二步:遍历商品列表,拼接基础信息和关联价格 $result = []; foreach ($barang as $barangItem) { $currentId = $barangItem['id_barang']; $temp = $barangItem; // 匹配到价格就挂载对应集合,没匹配到就生成要求的空结构 if (isset($groupedHarga[$currentId])) { $temp['dataharga'] = $groupedHarga[$currentId]; } else { $temp['dataharga'] = [ [ 'id_barang' => "", 'harga' => "" ] ]; } $result[] = $temp; } // 打印验证结果 echo "<pre>"; print_r($result);
性能优化方案
不需要拆成两次数据库查询再在PHP层做合并,可以直接在SQL层用左关联一次查出所有数据,减少数据库IO开销,CodeIgniter参考写法:
$allData = $this->db ->select('pj_barang.*, pj_detailsupplier.harga, pj_detailsupplier.id_barang as harga_ref_id') ->from('pj_barang') ->join('pj_detailsupplier', 'pj_detailsupplier.id_barang = pj_barang.id_barang', 'left') ->where('pj_barang.dihapus', 'tidak') ->get() ->result_array(); // 后续按上面的分组逻辑整理数据即可
内容的提问来源于stack exchange,提问作者Sukmo Abadii
相关产品推荐
相关产品推荐

