Codeigniter组合AND/OR条件失效,如何用Active Record实现预期SQL?
解决CodeIgniter Active Record生成SQL逻辑分组问题
嘿,你遇到的这个问题本质是SQL逻辑运算符优先级导致的——AND的优先级比OR高,所以原来的Active Record代码生成的SQL会先执行NOT IN AND sub_category IN,再和category IN做OR,这和你预期的逻辑完全不符。
要让生成的SQL把sub_category IN和category IN作为一个整体,和前面的条件做AND关联,你需要用到CodeIgniter Active Record的分组条件功能,也就是group_start()和group_end()方法,用它们来包裹这两个OR关联的子句。
调整后的Active Record代码
$this->db->select("item.*"); $this->db->from("items"); $this->db->where_not_in('item.ID', $Not); // 开启分组,将后续的OR条件包裹在括号内 $this->db->group_start(); $this->db->where_in('item_sub_category.Sub_category', $Sub_category); $this->db->or_where_in('item_category.Category', $Category); $this->db->group_end(); $this->db->limit(4); return $this->db->get()->result_array();
调整说明
group_start()会在生成的SQL中插入左括号(,group_end()插入右括号),直接把两个OR条件包裹成一个独立的逻辑单元,确保SQL执行顺序符合你的预期。- 你原来
or_where_in里的最后两个参数NULL, FALSE可以去掉,现在通过分组就能精准控制逻辑结构,不需要手动关闭转义(如果业务确实需要关闭转义,也可以保留这两个参数)。
生成的目标SQL
调整后生成的SQL会完全匹配你的预期:
SELECT `item`.* FROM `item` LEFT JOIN `item_category` ON `item_category`.`item` = `item`.`id` LEFT JOIN `item_sub_category` ON `item_sub_category`.`item` = `item`.`id` WHERE `item`.`id` NOT IN( '12' ) AND (`item_sub_category`.`sub_category` IN( '65', '66', '67', '68' ) OR `item_category`.`category` IN( '35', '36' )) LIMIT 4
内容的提问来源于stack exchange,提问作者Shah Rushabh
相关产品推荐
相关产品推荐

