如何在查找条件CakePHP中混合AND和OR运算符
我想用CakePHP编写这个查询:如何在查找条件CakePHP中混合AND和OR运算符,cakephp,cakephp-2.3,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' =>
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'))
)
),
));
但结果并非预期。我也看到了相关的问题,但不适合我
非常感谢您的回答。您的问题源于此代码(此问题在eq_模型中重复出现) 它尝试将两个值指定给该关联数组的同一个键。您可以将代码重写为:
array(array('ChkMasterXsTask.pm_type' => $pm_type),
array('ChkMasterXsTask.pm_type' => 'XS'))
另一个提高可读性的选项是在函数中使用SQL的
。等价的SQL变成
SELECT *
FROM pm_management.chk_master_xs_tasks
WHERE eq_model IN ('D11 R', 'TODOS')
AND pm_type IN ('XD', 'XS');
这将使您的查找
更容易编写:
$this->ChkMasterXsTask->find('all', array(
'conditions' => array(
'ChkMasterXsTask.eq_model' => array($eq_model, 'TODOS'),
'ChkMasterXsTask.pm_type' => array($pm_type, 'XS'))
));
只是我在代码中看到一个错误,有一个逗号,不应该在那里
$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')
)
))
));
感谢您抽出时间回答我的问题。我使用相同的键是因为我需要两个可能的值,请注意,如果ChkMasterXsTask.pm_type
等于$pm_type
或'XS'
,我使用OR运算符来检索信息。另一方面,我将尝试您给我的选项进行测试。
函数中带有的选项解决了我的问题。非常感谢!谢谢你回答我的问题。我删除了逗号,但结果是一样的。我认为这不是问题所在。
$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')
)
))
));