Php Yii未正确合并标准-始终使用,即使我通过或

Php Yii未正确合并标准-始终使用,即使我通过或,php,sql,activerecord,join,yii,Php,Sql,Activerecord,Join,Yii,我在Yii中使用多个嵌套搜索条件来选择一个名为libraries的模型。条件如下: $criteria = new CDbCriteria(); $criteria->select = 't.id, t.barcode_1_id, t.barcode_2_id, t.library_type_id, t.qc_pass'; $criteria->order = 'patient.id DESC, t.id DESC'; $criteria->

我在Yii中使用多个嵌套搜索条件来选择一个名为libraries的模型。条件如下:

    $criteria = new CDbCriteria();
    $criteria->select = 't.id, t.barcode_1_id, t.barcode_2_id, t.library_type_id, t.qc_pass'; 
    $criteria->order = 'patient.id DESC, t.id DESC'; 
    $criteria->together = true;
    $with=array(
            'isolates'=>array(
              'select'=>false,
            ),
            'samples'=>array(
              'select'=>'samples.id, samples.sample_preservation_id, samples.tumor',
            ),
            'patient'=>array(
              'select'=>'patient.id',
            ),
            'flowcells'=>array(
                'select'=>'flowcells.id,flowcells.serial_id',
            ),
            'libraryType'=>array(
                'select'=>'libraryType.id,libraryType.short_name',
            ),
            'samplePreservation'=>array(
              'select'=>'samplePreservation.name',
            ),
            'program'=>array(
                'select'=>false,
                'condition'=>'program.name NOT LIKE "%Lab%"',
            ),
            'runs'=>array(
              'select'=>'runs.id',
            )
          );

    // by run ID
    if (is_array($runs) && (! empty($runs))) {
        $runCriteria = new CDbCriteria();
        $runCriteria->addInCondition("runs.id", $runs, 'OR');
        $criteria->mergeWith($runCriteria, $operator='OR');
        $something=true;
    }

    // libraries without patients
    if ( ($patients=='Unassigned') || (is_array($patients) && in_array('Unassigned',$patients)) ) {
        $unassCriteria = new CDbCriteria();
        $unassCriteria->addCondition('patient.id IS NULL');
        $criteria->mergeWith($unassCriteria, $operator='OR');
        $something=true;
    }

    if ( ($patients=='QC Pass') || (is_array($patients) && in_array('QC Pass',$patients)) ) {
        $qcCriteria = new CDbCriteria();
        $qcCriteria->addCondition('t.qc_pass = 1',$operator='AND');
        $qcCriteria->addCondition('t.created BETWEEN CURDATE() - INTERVAL 30 DAY AND SYSDATE()','AND');
        $criteria->mergeWith($qcCriteria, $operator='OR');
        $something=true;
    }

    if ( ($patients=='Ready for Flowcell') || (is_array($patients) && in_array('Ready for Flowcell',$patients)) ) {
        $readyCriteria = new CDbCriteria();
        $readyCriteria->addCondition('flowcells.id IS NULL',$operator='AND');
        $readyCriteria->addCondition('runs.current_pipeline_node_id = 7',$operator='AND');
        $criteria->mergeWith($readyCriteria, $operator='OR');
        $something=true;
    }

    if (is_array($patients) && (! empty($patients))) {
        $ptArr= array_diff($patients, array('QC Pass','Unassigned','Ready for Flowcell'));
        $ptCriteria = new CDbCriteria();
        $ptCriteria->addInCondition("patient.id", $ptArr,$operator='OR');
        if ($ptArr) $criteria->mergeWith($ptCriteria, $operator='OR');
        $something=true;
    }



    if ($something) $librariesModel=Libraries::model()->with($with)->findAll($criteria);
$criteria->mergeWith($unassCriteria, false); 
然后我将这些结果格式化为一个视图

问题是Yii忽略了我的$operator='OR',总是使用and而不是OR。这是它生成的WHERE子句:

(选择并连接外观良好)

知道Yii为什么不让我用“或”来合并这些标准吗?我的目标是要有几个括号表达式,其中包含和,但不是排他性的。mergeWith方法应该使用OR、not和将这些条件添加到WHERE子句中


谢谢

找到了问题。我正在查看CDbCriteria更新版本的文档。它应该是真值或假值:

public function mergeWith($criteria,$useAnd=true)
{
    $and=$useAnd ? 'AND' : 'OR';
    .....
必须按如下方式使用:

    $criteria = new CDbCriteria();
    $criteria->select = 't.id, t.barcode_1_id, t.barcode_2_id, t.library_type_id, t.qc_pass'; 
    $criteria->order = 'patient.id DESC, t.id DESC'; 
    $criteria->together = true;
    $with=array(
            'isolates'=>array(
              'select'=>false,
            ),
            'samples'=>array(
              'select'=>'samples.id, samples.sample_preservation_id, samples.tumor',
            ),
            'patient'=>array(
              'select'=>'patient.id',
            ),
            'flowcells'=>array(
                'select'=>'flowcells.id,flowcells.serial_id',
            ),
            'libraryType'=>array(
                'select'=>'libraryType.id,libraryType.short_name',
            ),
            'samplePreservation'=>array(
              'select'=>'samplePreservation.name',
            ),
            'program'=>array(
                'select'=>false,
                'condition'=>'program.name NOT LIKE "%Lab%"',
            ),
            'runs'=>array(
              'select'=>'runs.id',
            )
          );

    // by run ID
    if (is_array($runs) && (! empty($runs))) {
        $runCriteria = new CDbCriteria();
        $runCriteria->addInCondition("runs.id", $runs, 'OR');
        $criteria->mergeWith($runCriteria, $operator='OR');
        $something=true;
    }

    // libraries without patients
    if ( ($patients=='Unassigned') || (is_array($patients) && in_array('Unassigned',$patients)) ) {
        $unassCriteria = new CDbCriteria();
        $unassCriteria->addCondition('patient.id IS NULL');
        $criteria->mergeWith($unassCriteria, $operator='OR');
        $something=true;
    }

    if ( ($patients=='QC Pass') || (is_array($patients) && in_array('QC Pass',$patients)) ) {
        $qcCriteria = new CDbCriteria();
        $qcCriteria->addCondition('t.qc_pass = 1',$operator='AND');
        $qcCriteria->addCondition('t.created BETWEEN CURDATE() - INTERVAL 30 DAY AND SYSDATE()','AND');
        $criteria->mergeWith($qcCriteria, $operator='OR');
        $something=true;
    }

    if ( ($patients=='Ready for Flowcell') || (is_array($patients) && in_array('Ready for Flowcell',$patients)) ) {
        $readyCriteria = new CDbCriteria();
        $readyCriteria->addCondition('flowcells.id IS NULL',$operator='AND');
        $readyCriteria->addCondition('runs.current_pipeline_node_id = 7',$operator='AND');
        $criteria->mergeWith($readyCriteria, $operator='OR');
        $something=true;
    }

    if (is_array($patients) && (! empty($patients))) {
        $ptArr= array_diff($patients, array('QC Pass','Unassigned','Ready for Flowcell'));
        $ptCriteria = new CDbCriteria();
        $ptCriteria->addInCondition("patient.id", $ptArr,$operator='OR');
        if ($ptArr) $criteria->mergeWith($ptCriteria, $operator='OR');
        $something=true;
    }



    if ($something) $librariesModel=Libraries::model()->with($with)->findAll($criteria);
$criteria->mergeWith($unassCriteria, false); 
而不是

$criteria->mergeWith($unassCriteria, 'OR'); 
因为“或”是真的