0

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場所は1つだけです。に対して行われるパラメータ バインディングはありません。これは で起こっています。、一方、値自体が a であることに注意し、適切な を生成するようです。:expunhex(:value):valueCDbCommandBuilder::createFindCommandCDbCommandBuilder::createInsertCommandCDbExpressionbindValue'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 で使用されることを意図していないことを意味しますか? はいの場合、代替手段は何ですか?

4

1 に答える 1

1

実際、サーカスは必要ないことがわかりました。以下は で動作しfindAllます:

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

addまたはupdate操作では同じことが機能しないことに注意してください。

于 2013-10-27T09:37:14.643 に答える