ci框架中关联查询后插入数据是先查后插的两个独立操作,需正确读取查询结果构造插入数据,并注意事务控制与字段映射。

CI框架中完成关联查询后再插入数据,本质是两个独立操作:先查、后插,中间不自动联动。关键在于确保查询结果能被正确读取并用于构造插入数据,同时注意事务控制和字段映射。
一、先执行多表关联查询获取所需数据
使用 Active Record 的 join() 链式方法组合查询,支持 inner、left、right 等类型:
-
基础写法:
$query = $this->db->select('u.id, u.name, o.order_no')<br> ->from('users u')<br> ->join('orders o', 'o.user_id = u.id', 'left')<br> ->where('u.status', 1)<br> ->get(); - 用 result_array() 或 result() 获取结果,推荐
result_array()方便后续拼装插入数据; - 若需分页或限制条数,可在
get()前加limit(10)或limit(10, 20)(偏移+数量)。
二、从查询结果中提取并组装插入数据
不是所有字段都要插入,需按目标表结构筛选、转换、补全:
- 遍历查询结果,逐条构造待插入的关联数组,例如:
foreach ($query->result_array() as $row) {<br> $insert_data[] = [<br> 'user_id' => $row['id'],<br> 'log_type' => 'order_sync',<br> 'created_at' => date('Y-m-d H:i:s'),<br> 'order_ref' => $row['order_no'] ?: null<br> ];<br>} - 注意空值处理(如
$row['order_no'] ?: null),避免插入非法 NULL 或空字符串; - 若目标表有自增主键,无需在数组中提供该字段。
三、执行批量或单条插入操作
根据数据量选择合适方式,推荐优先用 insert_batch() 提升性能:
-
批量插入(推荐):
if (!empty($insert_data)) {<br> $this->db->insert_batch('user_logs', $insert_data);<br>}
自动拼成一条 INSERT … VALUES (…), (…), (…) 语句,一次数据库交互; -
单条插入(调试或少量数据):
foreach ($insert_data as $item) {<br> $this->db->insert('user_logs', $item);<br>}
每次生成独立 INSERT,适合需逐条判断返回值的场景; - 插入后可用
$this->db->affected_rows()检查影响行数,确认是否成功。
四、可选:用事务包裹保障数据一致性
当关联查询结果直接影响插入逻辑(如“查到未同步订单才插入日志”),建议加事务:
- 开始事务:
$this->db->trans_start(); - 执行查询 + 组装 + 插入全部操作;
- 结束事务:
$this->db->trans_complete(); - 通过
$this->db->trans_status()判断是否全部成功,失败则自动回滚。











