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

CodeIgniter中单表单多表多行插入:如何用循环生成批量数组

解决方案

先修复主表pms_id的获取逻辑(原代码在编辑场景下存在bug),再通过循环动态生成批量插入数组,修改后的完整Model函数代码如下:

function add_pms($data)
{
    $data = escape_array($data);

    $pms_data = [
        'unit_id'   => $data['unit_id'],
    ];

    // 处理主表的新增/编辑,同时正确获取pms_id
    if(isset($data['edit_pms_id'])) {
        $this->db->set($pms_data)->where('id', $data['edit_pms_id'])->update('pms_service_fee');
        $pms_id = $data['edit_pms_id']; // 编辑时直接使用传入的ID
    } else {
        $this->db->insert('pms_service_fee', $pms_data);
        $pms_id = $this->db->insert_id(); // 新增时使用插入后的自增ID
    }

    // 初始化批量插入数组
    $pms_service_fee_detail = [];

    // 确保服务费用ID数组有效,避免循环报错
    if(isset($data['pms_service_fee_id']) && is_array($data['pms_service_fee_id'])) {
        // 遍历服务费用ID数组,生成每条明细数据
        foreach($data['pms_service_fee_id'] as $index => $fee_id) {
            // 跳过空的费用ID(可根据业务需求调整此逻辑)
            if(empty($fee_id)) continue;

            // 获取对应索引的价格,防止索引越界给默认值
            $fee_price = isset($data['pms_service_fee_price'][$index]) ? $data['pms_service_fee_price'][$index] : 0;

            $pms_service_fee_detail[] = [
                'pms_id'                => $pms_id,
                'pms_service_fee_id'    => $fee_id,
                'pms_service_fee_price' => $fee_price,
            ];
        }
    }

    // 有明细数据时执行批量操作
    if(!empty($pms_service_fee_detail)) {
        // 编辑场景下建议先清空旧明细,避免数据重复(不需要可删除此段)
        if(isset($data['edit_pms_id'])) {
            $this->db->where('pms_id', $pms_id)->delete('pms_service_fee_detail');
        }
        $this->db->insert_batch('pms_service_fee_detail', $pms_service_fee_detail); 
    }
}

关键说明:

  • 修复ID获取逻辑:编辑主表时不能用insert_id(),直接使用传入的edit_pms_id,否则会得到错误的ID值。
  • 动态生成明细:通过foreach遍历pms_service_fee_id数组,同步取同索引的价格,保证每组数据一一对应,适配任意数量的明细行。
  • 容错处理:先判断数组有效性,跳过空ID,处理价格索引越界的情况,避免非预期报错。
  • 编辑场景优化:编辑时先删除旧明细再插入新数据,防止明细堆积重复(业务需保留历史则可移除该逻辑)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:30:53