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 であることに注意し、適切な を生成するようです。: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 で使用されることを意図していないことを意味しますか? はいの場合、代替手段は何ですか?