Yii CDbCriteria AND OR


Yii CDbCriteria AND OR

$criteria = new CDbCriteria();

        $criteria->addCondition('admin_status = ' . Transaction::ADMIN_STATUS_WAITING);
        $criteria->addCondition('status = ' . Transaction::ORDER_STATUS_WAITING);
        $criteria->addCondition(
            'DATE_SUB(CURRENT_DATE(), INTERVAL ' . $this->period . ' DAY) > DATE(order_date)'
        );
        if($this->type != null) {
            $criteria->addCondition('type = ' . (int)$this->type);
        }
        $criteria->addCondition('admin_status = ' . Transaction::ADMIN_STATUS_REJECTED . ' AND  status != ' . Transaction::ORDER_STATUS_REJECTED, 'OR');

我现在有什么:

((admin_status = 0) AND (status = 0)) AND (DATE_SUB(CURRENT_DATE(), INTERVAL 120 DAY)> DATE(order_date))) OR (admin_status = 2 AND status != 2)

我需要什么:

(((admin_status = 0) AND (status = 0)) AND (DATE_SUB(CURRENT_DATE(), INTERVAL 120 DAY)> DATE(order_date)))) OR (admin_status = 2 AND status != 2)

如何将3个第一标准合并为一个?

我需要(criteria1 AND criteria2 AND criteria3 ) OR (CRITERIA 4)

基本上,只需在一个条件中完成所有操作。即使它们是类常量,我仍然建议使用参数绑定。

$criteria = new CDbCriteria();
$criteria->addCondition('((((admin_status = :admin_status_waiting) AND (status = :order_status_waiting)) AND (DATE_SUB(CURRENT_DATE(), INTERVAL :period DAY) > DATE(order_date)))) OR (admin_status = :admin_status_rejected AND status != :order_status_rejected)');
$criteria->params = array(
    ':period' => $this->period,
    ':admin_status_waiting' => Transaction::ADMIN_STATUS_WAITING,
    ':order_status_waiting' => Transaction::ORDER_STATUS_WAITING,
    ':admin_status_rejected' => Transaction::ADMIN_STATUS_REJECTED,
    ':order_status_rejected' => Transaction::ORDER_STATUS_REJECTED
);

我想这已经是你想要的了,如果你检查正确的话

(
           (
           (admin_status = 0) AND (status = 0)
           ) AND (DATE_SUB(CURRENT_DATE(), INTERVAL 120 DAY) > DATE(order_date))
) OR (admin_status = 2 AND status != 2)

您只是想添加一对额外的括号。