动态PDO AND和OR

时间:2012-08-24 14:44:51

标签: pdo yii

我对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是否提供了任何简单的方法来实现这一点,而无需编写复杂的代码来命名我的参数等?

1 个答案:

答案 0 :(得分: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++;
}

这将为您的每个参数生成自定义标识符,以便对它们进行验证。然后,您可以在查询中使用$criteria