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
相关产品推荐
相关产品推荐

