如何用CodeIgniter查询构造器实现多输入搜索的MySQL查询?
解决CodeIgniter Query Builder多输入搜索的逻辑问题
我明白你的问题了——当混用like和or_like再加上where条件时,CodeIgniter的Query Builder默认的条件拼接顺序会导致逻辑优先级出错,最终生成的SQL不符合你的预期。
问题根源
你原来的代码生成的SQL会是这样的:
SELECT * FROM `articulos` WHERE `num_articulo` LIKE '{$aricle_number}%' OR `descripcion1` LIKE '%{$article_description}%' OR `descripcion2` LIKE '%{$article_description}%' AND `status` = 1
由于SQL中AND的优先级高于OR,这段SQL的实际逻辑是:
- 匹配
num_articulo的记录(不管status是否为1),或者 - 匹配
descripcion1的记录(不管status是否为1),或者 - 同时匹配
descripcion2且status=1的记录
这显然和你想要的「满足任意搜索条件且状态为1」的逻辑不符。
解决方案:使用条件分组
CodeIgniter的Query Builder提供了group_start()和group_end()方法来包裹一组条件,确保它们的逻辑优先级正确。修正后的代码如下:
// 开始分组,将所有搜索条件包裹在括号内 $this->db->group_start(); $this->db->like('num_articulo', $aricle_number, 'after'); $array = array('descripcion1' => $article_description, 'descripcion2' => $article_description); $this->db->or_like($array); $this->db->group_end(); // 全局过滤状态为1的记录 $this->db->where('status', 1); return $this->db->get('articulos')->result_array();
修正后的SQL逻辑
这段代码会生成符合预期的SQL:
SELECT * FROM `articulos` WHERE (`num_articulo` LIKE '{$aricle_number}%' OR `descripcion1` LIKE '%{$article_description}%' OR `descripcion2` LIKE '%{$article_description}%') AND `status` = 1
现在所有搜索条件都被括号包裹,status=1会过滤所有满足括号内任意条件的记录,完全符合你的需求。
小提示
注意你代码里的变量名拼写:$aricle_number少了一个t(正确应为$article_number),虽然可能是笔误,但建议修正避免潜在的运行时错误。
内容的提问来源于stack exchange,提问作者Lucas.Fradusco
相关产品推荐
相关产品推荐

