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

Codeigniter中where搭配多个or_like查询条件失效问题求解

问题原因

  • SQL逻辑运算符存在优先级:AND 的优先级高于 OR,你当前生成的原生SQL实际执行逻辑等价于:
    SELECT * FROM (`patient`) WHERE (`hospital_id` = '802' AND `name` LIKE '%fn%') OR `phone` LIKE '%fn%' OR `nic` LIKE '%fn%' OR `passport` LIKE '%fn%' OR `ticket` LIKE '%fn%' ORDER BY `id` DESC
    
    只要后面任意一个OR关联的模糊条件匹配,哪怕hospital_id不等于802也会被命中,所以看起来hospital_id的条件失效了。

符合CodeIgniter规范的正确写法

你需要用查询分组将多个OR关联的模糊查询包裹为一个整体条件,再和hospital_id = 802做AND关联:

CodeIgniter 3 写法

$value = 'fn';
$this->db->where('hospital_id', 802);
// 开启条件分组,分组内的条件会自动用括号包裹
$this->db->group_start();
$this->db->like('name', $value);
$this->db->or_like('phone', $value);
$this->db->or_like('nic', $value);
$this->db->or_like('passport', $value);
$this->db->or_like('ticket', $value);
$this->db->group_end();

$rows = $this->db->order_by("id", "DESC")->get('patient')->result();

CodeIgniter 4 写法

$value = 'fn';
$rows = $db->table('patient')
    ->where('hospital_id', 802)
    ->groupStart()
        ->like('name', $value)
        ->orLike('phone', $value)
        ->orLike('nic', $value)
        ->orLike('passport', $value)
        ->orLike('ticket', $value)
    ->groupEnd()
    ->orderBy('id', 'DESC')
    ->get()
    ->getResult();

最终生成的正确SQL

SELECT * FROM (`patient`) WHERE `hospital_id` = '802' AND (`name` LIKE '%fn%' OR `phone` LIKE '%fn%' OR `nic` LIKE '%fn%' OR `passport` LIKE '%fn%' OR `ticket` LIKE '%fn%') ORDER BY `id` DESC

这个SQL会先匹配hospital_id = 802,再在这个范围内匹配任意一个模糊条件,完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:36:05