You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeIgniter Active Records中用LIKE子句实现单列多值过滤问题

解决CodeIgniter Active Records多选下拉过滤无匹配的问题

你碰到的这个问题其实很常见——单选时LIKE能正常工作,但多选就失效,核心原因是你当前的逻辑只处理了单个值的情况,而多选时前端传递的是数组,直接用LIKE会把数组转成字符串(比如Array),数据库自然找不到匹配的记录。下面给你两种针对性的解决方案,根据你的过滤需求选就行:

方案1:精确匹配(多选枚举值,比如分类ID、状态)

如果你的下拉选项是固定的枚举值(比如订单状态、分类ID这类明确的选项),用where_in会更高效准确:

private function _get_datatables_query() {
    // 你的基础查询逻辑(比如select、from等)...
    
    // 获取多选的过滤参数,注意前端下拉框name要设为数组格式,比如filter_category[]
    $filter_values = $this->input->post('filter_category');
    
    if (!empty($filter_values)) {
        if (is_array($filter_values)) {
            // 多选情况:用where_in匹配多个值
            $this->db->where_in('table_category_column', $filter_values);
        } else {
            // 单个值情况:保留原来的like或者改用where(精确匹配的话用where更合适)
            $this->db->like('table_category_column', $filter_values);
        }
    }
    
    // 其他DataTables相关处理逻辑...
}

方案2:模糊匹配(多选关键词,比如商品名称关键词)

如果需要对每个多选值做模糊匹配(比如多选多个关键词,只要包含其中一个就匹配),就用分组的or_like来实现:

private function _get_datatables_query() {
    // 你的基础查询逻辑...
    
    $filter_values = $this->input->post('filter_keyword');
    
    if (!empty($filter_values)) {
        if (is_array($filter_values)) {
            // 开启分组,避免和其他查询条件冲突
            $this->db->group_start();
            foreach ($filter_values as $value) {
                $this->db->or_like('table_keyword_column', $value);
            }
            $this->db->group_end();
        } else {
            $this->db->like('table_keyword_column', $filter_values);
        }
    }
    
    // 其他DataTables相关处理逻辑...
}

关键前置检查

别忘了确保前端的下拉框配置正确:

  • 给select标签加上multiple属性,允许用户多选
  • name属性要设为数组形式,比如<select name="filter_category[]" multiple>

这样调整后,不管是选单个值还是多个值,过滤逻辑都能正常工作啦~

内容的提问来源于stack exchange,提问作者Ganesh Aher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:09:25