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` DESCOR关联的模糊条件匹配,哪怕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
相关产品推荐
相关产品推荐

