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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:44:09