Yii 在findAll中使用cdbeexpression和CDBCriteria

Yii 在findAll中使用cdbeexpression和CDBCriteria,yii,Yii,我试图通过CActiveRecord生成并执行以下sql: SELECT * FROM `bucket` `t` WHERE bkt_user = unhex('A4FF2131E00C4696837689FCAAAC7DD2'); 我想到了这个: $uuid = 'A4FF2131E00C4696837689FCAAAC7DD2'; $criteria = new CDbCriteria(); $expression = new CDbExpression(

我试图通过CActiveRecord生成并执行以下sql:

SELECT * FROM `bucket` `t` 
WHERE bkt_user = unhex('A4FF2131E00C4696837689FCAAAC7DD2');
我想到了这个:

$uuid = 'A4FF2131E00C4696837689FCAAAC7DD2';
$criteria = new CDbCriteria();
$expression = new CDbExpression(
                    'unhex(:value)', 
                    array(':value'=>$uuid,));
$criteria->addCondition("bkt_user = :exp");
$criteria->params = array(':exp' => $expression);
$buckets = Bucket::model()->findAll($criteria);
代码执行时没有错误或异常,但不会按预期返回结果。稍微调试后发现,上面的代码段生成以下sql:

SELECT * FROM `xpg_bucket` `t` WHERE bkt_user = :exp
只有一个
CDbCommandBuilder::bindValue
,其中
:exp
绑定到
unhex(:value)
。没有为
:value
执行参数绑定。这发生在
CDbCommandBuilder::createFindCommand
中<另一方面,code>CDbCommandBuilder::createInsertCommand似乎将值本身作为
CDbExpression
进行处理,并生成相应的
bindValue

CDbExpression的
文档包含:

* CDbExpression is mainly used in {@link CActiveRecord} as attribute values.
* When inserting or updating a {@link CActiveRecord}, attribute values of      
* type CDbExpression will be directly put into the corresponding SQL statement
* without escaping.  

这是否意味着CDbExpression不应与findAll()中的CDbCriteria一起使用?如果是,还有什么选择

事实上,原来马戏团是不需要的。以下内容适用于
findAll

$criteria->addCondition('bkt_user = unhex(:value)');
$criteria->params = array(':value'=>'665730BDEDA7489383E2519DB5DE6D60');
$buckets = Bucket::model()->findAll($criteria);

请注意,添加或更新操作将无法使用相同的方法。

您是否尝试过
Bucket::model()->findAllByAttributes(数组('bkt_user'=>新的CDbExpression(…)