我遇到与this question完全相同的问题(尝试将CDbCriteria
用于名为key
的列reserved word in MySQL)。但是,provided solution:
$criteria = new CDbCriteria;
$criteria->condition = 't.key=:key';
$criteria->params = array(':key'=>$this->key);
$criteria->compare('position', $this->position);
$criteria->compare('dictionary', $this->dictionary);
只对我有用。我不再获得例外,但搜索仅适用于key
列。忽略所有其他内容(如果设置了key
,则仅在搜索中仅考虑此值,如果未设置,则始终返回空结果集。)
我错过了什么?当我的表包含作为列名的reserverd单词时,我应该如何构造CDbCriteria
查询,因此搜索也会尊重所有其他(非保留)列,而不仅仅是这一列?
答案 0 :(得分:1)
CDbCriteria::compare()
仅在设置参数时添加条件,否则不执行任何操作。See Here
$criteria->condition = 't.key=:key';
$criteria->params = array(':key'=>$this->key);
然而,无论是否设置了密钥,该逻辑都有效。所以基本上你的条件变成了
SELECT * FROM `some_table` t WHERE t.key =:key
即使键值为空,导致在未设置键属性时查询中断
因此,如果你像这样修改你的陈述,那么它就可以了
if(isset($this->key){
$criteria->condition = 't.key=:key';
$criteria->params = array(':key'=>$this->key);
}
在这种情况下,此语句仅在设置了key属性时激活,否则将被忽略,并且您的查询不会中断