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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:18:15