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
相关产品推荐
相关产品推荐

