【问题标题】:Using CDBExpression With CDBCriteria In findAll在 findAll 中使用 CDBExpression 和 CDBCriteria
【发布时间】:2013-10-26 16:34:31
【问题描述】:

我正在尝试通过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);

代码执行时没有错误或异常,但未按预期返回结果。稍微调试一下发现上面的sn -p 生成如下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 一起使用?如果是,有什么替代方案?

【问题讨论】:

  • 你试过Bucket::model()->findAllByAttributes(array('bkt_user'=>new CDbExpression(.....))吗?

标签: yii


【解决方案1】:

实际上,马戏团并不是必需的。以下适用于findAll

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

请注意,addupdate 操作也无法使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多