
本文介绍在 CodeIgniter 框架中,如何通过 where_in() 方法替代单一值的 where() 条件,高效查询数据库中满足多个离散值(如 status = 1 或 status = 3)的记录。
本文介绍在 codeigniter 框架中,如何通过 `where_in()` 方法替代单一值的 `where()` 条件,高效查询数据库中满足多个离散值(如 status = 1 或 status = 3)的记录。
在 CodeIgniter 的 Query Builder(查询构造器)中,当需要对某字段匹配多个可能的值(例如考勤状态中同时统计“已到”和“迟到”),不能直接将数组赋值给 get_where() 的条件数组——因为 get_where() 内部调用的是 where(),仅支持精确单值匹配。此时应改用 where_in() 方法,它会生成 SQL 中的 IN 子句,语义清晰且性能良好。
以下为优化后的完整方法示例:
public function get_tertiarylevel_present() {
$this->db->where('timestamp', strtotime(date('Y-m-d')));
$this->db->where('section_id', 11);
$this->db->where_in('status', [1, 3]); // ✅ 支持多值:status IN (1, 3)
$query = $this->db->get('daily_attendances');
return $query->num_rows();
}
✅ 关键说明:
-
where_in($field, $values)第二个参数支持索引数组(如[1, 3])或关联数组(键会被忽略,仅取值); - 自动生成安全的预处理语句,有效防止 SQL 注入;
- 可与其他
where()、like()等链式方法自由组合,保持逻辑可读性。
⚠️ 注意事项:
- 若
$values为空数组([]),CodeIgniter 3 默认会生成IN (),导致 SQL 错误;建议添加判空保护:$statuses = [1, 3]; if (!empty($statuses)) { $this->db->where_in('status', $statuses); } - 时间戳生成建议提取为变量(提升可测性与复用性):
$today_ts = strtotime(date('Y-m-d')); $this->db->where('timestamp', $today_ts);
该方案不仅解决了多状态联合统计需求,也符合 CodeIgniter 最佳实践:显式构建条件、避免硬编码 SQL、保障安全性与可维护性。











