CodeIgniter中按年龄优先级更新队列序号(no_antrian)逻辑排查求助
队列表队列号调整逻辑问题排查与修复
原代码核心问题分析
- 仅查询单条数据导致逻辑完全失效:原代码使用
$this->db->limit(1),仅获取队列中的第一条数据,后续循环只能处理这一条,无法遍历所有需要调整的患者,这是数据无变化的核心原因。 - 嵌套循环逻辑混乱:在第一个
foreach内重复遍历同一个查询结果,内层循环的条件与外层逻辑无关联,无法正确定位需要后移队列号的患者。 - SQL语句语法错误:手动拼接的UPDATE语句存在严重语法问题,例如把PHP逻辑运算符直接混入SQL条件,导致语句无效,执行后无任何更新。
- 队列号计算逻辑错误:
$noAntrian的初始化和递增逻辑完全偏离需求,无法正确计算新患者的插入位置。
修正后的实现代码
// 1. 查询当前科室、当天所有已排队患者,按年龄降序+队列号升序排序(年龄大的排前) $this->db->where('id_poli', $id_poli); $this->db->where('tanggal', $tanggal); $this->db->order_by('umur', 'DESC'); $this->db->order_by('no_antrian', 'ASC'); $query = $this->db->get('booking'); $noAntrian = 1; // 2. 计算新患者的队列号:统计年龄大于当前患者的人数+1 foreach ($query->result_array() as $row) { if ($row['umur'] > $usia) { $noAntrian++; } else { // 遇到年龄小于等于的患者,停止统计,后续队列都需要后移 break; } } // 3. 批量更新:将所有队列号>=新队列号的患者,队列号+1(后移) if ($noAntrian <= $query->num_rows()) { $this->db->set('no_antrian', 'no_antrian + 1', FALSE); $this->db->where('id_poli', $id_poli); $this->db->where('tanggal', $tanggal); $this->db->where('no_antrian >=', $noAntrian); $this->db->update('booking'); } return $noAntrian;
修正说明
- 移除
limit(1),获取全部相关患者数据,确保能遍历整个队列。 - 调整排序规则,按年龄降序排列,正确定位新患者的插入位置。
- 使用CodeIgniter Active Record构建UPDATE语句,避免手动拼接SQL的语法错误,同时通过
set方法的第三个参数FALSE实现直接执行no_antrian + 1的数值运算。 - 逻辑简化:先计算插入位置,再批量更新需要后移的队列号,相比循环单条更新效率更高。
内容的提问来源于stack exchange,提问作者Afifah Putri
相关产品推荐
相关产品推荐

