
本文介绍在 CodeIgniter 框架中,如何将单一状态值(如 status = 1)扩展为多状态值(如 status IN (1, 3))的数据库查询,重点讲解 where_in() 方法的正确用法及替代方案。
本文介绍在 codeigniter 框架中,如何将单一状态值(如 `status = 1`)扩展为多状态值(如 `status in (1, 3)`)的数据库查询,重点讲解 `where_in()` 方法的正确用法及替代方案。
在 CodeIgniter 的 Query Builder(查询构造器)中,当需要匹配字段的多个可能值(例如考勤状态中同时统计“已到”和“迟到”),不能直接在 get_where() 的关联数组条件中传入数组——因为默认的键值对方式仅支持等值匹配(=),不支持 IN 语义。
正确的做法是改用链式调用,并结合 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()的第二个参数必须是索引数组(如[1, 3]),不能是关联数组(如['present' => 1, 'late' => 3]),否则将导致 SQL 错误;- 若数组为空(
[]),CodeIgniter 会抛出异常或返回空结果,建议在调用前做非空校验;- 如需兼容更复杂逻辑(如
status IN (1, 3) OR status IS NULL),应改用$this->db->group_start()->where_in(...)->or_where_null(...)->group_end()组合条件。
此外,为提升代码可维护性,推荐将硬编码值提取为常量或配置项:
// 在模型或配置文件中定义
const STATUS_PRESENT = 1;
const STATUS_LATE = 3;
// 调用时更清晰
$this->db->where_in('status', [self::STATUS_PRESENT, self::STATUS_LATE]);总结:where_in() 是处理“多选一”字段条件的标准且安全的方式,替代了手动拼接 SQL 或重复调用 or_where()。它既保持了 Query Builder 的防注入优势,又显著提升了多值查询的开发效率与可读性。


















