我想使用Codeigniter中的活动记录生成以下SQL代码:
WHERE name != 'Joe' AND (age < 69 OR id > 50)
做下面的事情似乎是我所能做的,我不知道如何对它们进行分组
$this->db->select()->from('users')->where('name !=', 'Joe')->where('age <', 69)->or_where('id <', $id);
我的SQL查询太复杂了,所以我不想用传统的SQL重写所有的东西。
- 更新**
我的SQL代码是根据传入模型方法的某些参数的值动态生成的。不能使用括号的问题导致了一个问题,因为运算符的优先级是AND
在OR
之前先计算。
- 下面是我的活动记录代码块,在它之前和之后还有一些其他代码:
... some $this->db->where() ...
... some $this->db->where() ...
if($price_range) {
$price_array = explode('.', $price_range);
for($i = 0; $i < count($price_array); $i++) {
if($i == 0) {
$this->db->where('places.price_range', $price_array[$i]);
} else {
$this->db->or_where('places.price_range', $price_array[$i]);
}
}
}
... some $this->db->where() ...
... some $this->db->where() ...
出现问题是因为我使用的$this->db->or_where()
引入了一个OR
子句,该子句使运算符优先级陷入混乱,而不能使用( )
更改顺序。
- 有什么办法可以解决这个问题吗**
6条答案
按热度按时间blmhpbnm1#
在Codeigniter 3中,您可以用途:
在Codeigniter 4中,您可以用途:
也许能帮上忙
xu3bshqb2#
可以使用一个大字符串。
$this->db->select()->from('users')->where("name != 'Joe' AND (age < 69 OR id > 50) ");
qlzsbp2j3#
where子句的分组默认不在CI中,需要扩展核心,增加能力,我做了如下工作:
用法:
或
复杂查询,如
yhuiod9q4#
CI 3有你需要的一切!
https://www.codeigniter.com/userguide3/database/query_builder.html#query-grouping
6mw9ycah5#
我所做的是在where之后复制and子句,这实际上与长字符串选择相同。
一个大字符串的方式可能更好。
mhd8tkvw6#
动态生成SQL查询并将其插入
$this->db->where()
。谢谢大家!