2012-08-24 74 views
0

Yii的CDBCrtieria构建器出现问题。我正在尝试使用PDO提供的转义和安全函数进行相当复杂的查询。Dynamic PDO AND and OR

这里是我的基本试图建立查询:

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提供任何简单的方法来实现这一点,而不必处理编写复杂的代码来命名我的PARAMS等?

回答

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

+0

真棒酱我忘了你可以做到这一点!我会尽快测试并标记,谢谢:) – Sammaye