我试图通过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
和AFAIK只有一个CDbCommandBuilder::bindValue
:exp
绑定到unhex(:value)
。没有为:value
完成参数绑定。这发生在CDbCommandBuilder::createFindCommand
。另一方面,CDbCommandBuilder::createInsertCommand
似乎将值本身设为CDbExpression
并生成相应的bindValue's
。
CDbExpression's
文档包含:
* 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?如果是,那么替代方案是什么?
答案 0 :(得分:1)
实际上,事实证明不需要马戏团。以下内容适用于findAll
:
$criteria->addCondition('bkt_user = unhex(:value)');
$criteria->params = array(':value'=>'665730BDEDA7489383E2519DB5DE6D60');
$buckets = Bucket::model()->findAll($criteria);
请注意,同样不适用于add
或update
操作。