【发布时间】:2011-09-22 03:39:30
【问题描述】:
我想在 Codeigniter 中使用 Active Records 生成以下 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 重写所有内容。
更新
My 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 子句,该子句将运算符优先级置于混乱状态,而无法使用( ) 更改顺序。
** 有没有办法解决这个问题? **
【问题讨论】:
-
它似乎不太复杂,不能让你用普通 SQL 编写它
-
@yes123:上面的例子只是一个例子,仅我的活动记录就产生了多达60多行动态生成的实际SQL代码,其中许多是条件SQL语句。
-
这是 Codeigniter 中 Activerecord 类的不幸限制。
-
@timw4mail:有什么建议吗?用纯 SQL 重写所有内容的任何替代方法?
-
@Nyxynyx 最好的方法可能是将 where 子句作为纯 sql 字符串执行。 $this->db->where() 方法可以采用纯字符串。
标签: php mysql codeigniter activerecord