动态PDO与OR

动态PDO与OR,pdo,yii,Pdo,Yii,我对Yii的CDBCrtieriabuilder有问题。我试图在使用PDO提供的转义和安全函数时进行一个相当复杂的查询 以下是我基本上试图构建的查询: SELECT * FROM tbl_audit_log WHERE (model_id = 1 AND model = "Title") OR (model_id = 1 AND model = "Product") //etc WHERE (model_id = 1 AND model = "Title

我对Yii的
CDBCrtieria
builder有问题。我试图在使用PDO提供的转义和安全函数时进行一个相当复杂的查询

以下是我基本上试图构建的查询:

SELECT * FROM tbl_audit_log 
    WHERE (model_id = 1 AND model = "Title") OR 
          (model_id = 1 AND model = "Product") //etc
    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
的值。我必须找到一个简单的方法来构建:

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

我已经浏览了文档,但最近看到的是
addCondition
,它需要复杂的编码才能正常工作


Yii是否提供了实现这一点的简单方法,而无需编写复杂的代码来命名参数等?

这确实有点复杂,但这里有一个可行的解决方案:

$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

这确实有点复杂,但这里有一个可行的解决方案:

$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

我忘了您可以这样做!我会尽快测试和标记的谢谢:)太棒了,我忘了你能做到!我会尽快测试和标记谢谢:)