如何在查找条件CakePHP中混合AND运算符

时间:2014-10-23 16:08:33

标签: cakephp cakephp-2.3

我想在CakePHP中编写此查询:

SELECT * FROM pm_management.chk_master_xs_tasks  
    where (eq_model = 'D11 R' OR eq_model = 'TODOS') AND (pm_type = 'XD' OR pm_type = 'XS');

我尝试了几种这样的方法:

$this->ChkMasterXsTask->find('all', array(
        'conditions' => array('AND' => array(
               array('OR' => array('ChkMasterXsTask.eq_model' => $eq_model,
                                   'ChkMasterXsTask.eq_model' => 'TODOS')),
               array('OR' => array('ChkMasterXsTask.pm_type' => $pm_type,
                                   'ChkMasterXsTask.pm_type' => 'XS'))
                )
            ),     
        ));

但结果不是预期的。我也看到了相关的问题,但对我来说并不适用。

非常感谢您的回答。

2 个答案:

答案 0 :(得分:2)

您的问题来自此代码(并且eq_model会重复此问题)

array('ChkMasterXsTask.pm_type' => $pm_type,
      'ChkMasterXsTask.pm_type' => 'XS')

尝试将2个值分配给该关联数组的相同键。您可以将代码重写为:

array(array('ChkMasterXsTask.pm_type' => $pm_type),
      array('ChkMasterXsTask.pm_type' => 'XS'))

另一个提高可读性的选项,使用SQL的IN函数。等效的SQL变为

SELECT * 
FROM pm_management.chk_master_xs_tasks  
WHERE eq_model IN ('D11 R', 'TODOS') 
  AND pm_type IN ('XD', 'XS');

哪个应该让你的find更容易写一下:

$this->ChkMasterXsTask->find('all', array(
        'conditions' => array(
          'ChkMasterXsTask.eq_model' => array($eq_model, 'TODOS'),
          'ChkMasterXsTask.pm_type' => array($pm_type, 'XS'))
        ));

答案 1 :(得分:-1)

我看到你的代码有错误,有一个逗号,不应该在那里。

  $this->ChkMasterXsTask->find(
        'all', array(
          'conditions' => array(
            'AND' => 
               array('OR' => array(
                 array('ChkMasterXsTask.eq_model' => $eq_model),
                 array('ChkMasterXsTask.eq_model' => 'TODOS')
                 ),

                 array('OR' => 
                   array('ChkMasterXsTask.pm_type' => $pm_type),
                   array('ChkMasterXsTask.pm_type' => 'XS')
                 )
            ))     
          ));