0

Yii のCDBCrtieriaビルダーに問題があります。PDO が提供するエスケープおよび安全な関数を使用しながら、かなり複雑なクエリを作成しようとしています。

基本的に作成しようとしているクエリは次のとおりです。

SELECT * FROM tbl_audit_log 
    WHERE (model_id = 1 AND model = "Title") OR 
          (model_id = 1 AND model = "Product") //etc

これは、次のように PHP で動的に構築されています。

$model_ids = array(array($model->id, 'Title'));
foreach($model->products as $id => $product){
    $model_ids[][] = $product->id;
    $model_ids[][] = "Product";
}

WHEREそのため、クエリを作成する前にの値はわかりません。ビルドする簡単な方法を見つけなければなりません:

    WHERE (model_id = 1 AND model = "Title") OR 
          (model_id = 1 AND model = "Product") //etc

動的に。

私はドキュメントに目を通しましたが、最も近いのは、addCondition適切に機能させるために複雑なコーディングが必要になるものです。

パラメータなどに名前を付けるための複雑なコードを書かなくても、Yii はこれを実現する簡単な方法を提供していますか?

4

1 に答える 1

3

それは確かにもう少し複雑ですが、ここに実用的な解決策があります:

$criteria = new CDbCriteria();
$param_id = 0;
// $model_ids is the one you built in your original code
foreach( $model_ids as $id_pair ) {
    $criteria->addCondition( '( model_id = :id' . $param_id . ' AND model = :model' . $param_id . ' )', 'OR' );
    $criteria->params[ ':id' . $param_id ] = $id_pair[0];
    $criteria->params[ ':model' . $param_id ] = $id_pair[1];
    $param_id++;
}

これにより、パラメーターごとにカスタムIDが生成されるため、すべてのパラメーターが検証されます。次に、クエリで使用でき$criteriaます。

于 2012-08-24T17:11:12.610 に答える