
本文介绍在 CodeIgniter 框架中,通过 PHP 数组操作将主表(barang)与关联表(harga)结果合并,实现以 id_barang 为键的嵌套结构,确保无关联记录也保留空占位,满足前端渲染或 API 输出需求。
本文介绍在 codeigniter 框架中,通过 php 数组操作将主表(barang)与关联表(harga)结果合并,实现以 `id_barang` 为键的嵌套结构,确保无关联记录也保留空占位,满足前端渲染或 api 输出需求。
在实际开发中,常需将一对多关系的数据库查询结果组织为结构化嵌套数组——例如商品主信息(pj_barang)与其多个价格记录(pj_detailsupplier)。CodeIgniter 原生不支持直接返回深度嵌套结果集,因此需在 PHP 层完成逻辑组装。关键在于:以主表为基准,逐条匹配关联数据,并统一挂载到 dataharga 子数组中。
以下为推荐实现方案(兼容 CodeIgniter 3.x/4.x):
// 1. 查询主表(确保所有商品,含无价格记录者)
$barang = $this->db
->select('pj_barang.*')
->where('dihapus', 'tidak')
->get('pj_barang')
->result_array();
// 2. 查询关联表(仅获取有效价格数据)
$harga = $this->db
->select('pj_detailsupplier.id_barang, pj_detailsupplier.harga')
->get('pj_detailsupplier')
->result_array();
// 3. 构建嵌套结构:遍历主表,查找匹配的价格项
foreach ($barang as &$item) {
// 使用 array_column + array_search 快速定位对应价格
$hargaIndex = array_search($item['id_barang'], array_column($harga, 'id_barang'));
if ($hargaIndex !== false) {
// 存在匹配项:封装为 dataharga 数组(注意:若允许多条价格,此处应收集全部而非仅第一条)
$item['dataharga'] = [$harga[$hargaIndex]];
} else {
// 无匹配项:提供空占位结构,保持字段一致性
$item['dataharga'] = [['id_barang' => '', 'harga' => '']];
}
}
// $barang 现已包含完整嵌套结构
⚠️ 重要注意事项:
- 上述示例假设每个 id_barang 在 harga 表中最多只有一条记录。若实际存在一对多关系(如不同供应商报价),应改用 array_filter() 收集全部匹配项:
$item['dataharga'] = array_filter($harga, function($h) use ($item) { return $h['id_barang'] == $item['id_barang']; }); - array_column($harga, 'id_barang') 要求 PHP ≥ 5.5.0;低版本可手动构建映射数组。
- 数据库层面更优解是使用 LEFT JOIN 一次性获取关联数据(避免 N+1 查询),再用 PHP 分组:
$joined = $this->db->select('pj_barang.*, pj_detailsupplier.harga') ->from('pj_barang') ->join('pj_detailsupplier', 'pj_barang.id_barang = pj_detailsupplier.id_barang', 'left') ->where('pj_barang.dihapus', 'tidak') ->get()->result_array(); // 后续用 group_by_id_barang() 函数重组
最终输出结构严格符合预期:每个商品条目均含 dataharga 键,其值为数组(即使为空),保障了数据契约的稳定性与前端处理的便利性。











