使用列名作为MySQL保留字构造CDbCriteria

时间:2014-06-21 12:08:20

标签: yii

我遇到与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查询,因此搜索也会尊重所有其他(非保留)列,而不仅仅是这一列?

1 个答案:

答案 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属性时激活,否则将被忽略,并且您的查询不会中断