如何使用CakePHP 3.x查询生成器表达或设置条件?

如何使用CakePHP 3.x查询生成器表达或设置条件?,php,cakephp,conditional-statements,query-builder,cakephp-3.x,Php,Cakephp,Conditional Statements,Query Builder,Cakephp 3.x,我尝试在cakephp 3.X中构建一个具有以下结构的查询: A、B、C和[D或E],其中A、B、C、D、E包含与或类似条件连接的值数组 $schools = $schools->where(['A IN' => $arrayOfAOptions]), $schools = $schools->where(['B IN' => $arrayOfBOptions]), $schools = $schools->where(['C IN' => $arrayO

我尝试在cakephp 3.X中构建一个具有以下结构的查询: A、B、C和[D或E],其中A、B、C、D、E包含与或类似条件连接的值数组

$schools = $schools->where(['A  IN' => $arrayOfAOptions]), 
$schools = $schools->where(['B IN' => $arrayOfBOptions]),
$schools = $schools->where(['C IN' => $arrayOfCOptions])

// want this to be firstly joined with OR before joining other conditions with AND
$schools = $schools->where(['D IN' => $arrayOfCOptions]) 
//or
$schools = $schools->where(['E IN' => $arrayOfCOptions])
这里的问题是,我无法将字段D和E隔离为或,并将其他字段与和连接起来

在CakePHP2中,我通过以下代码实现了它

$queryConditions = array(
  'or'=> array_merge(
    array(
      'School.D' =>  $this->Session->read('conditions.D')
    ), 
    array(
      'School.E' => $this->Session->read('conditions.E')
    )
  )
);
然后根据条件将其合并到其余部分
任何帮助都将不胜感激

您可以使用与CakePHP 2.x相同的样式,即传递嵌套在
键下的条件。您还可以将其包装在一个
where()
调用中

$schools->where([
    'A IN' => $arrayOfAOptions,
    'B IN' => $arrayOfBOptions,
    'C IN' => $arrayOfCOptions,
    'OR' => [
        'D IN' => $arrayOfDOptions,
        'E IN' => $arrayOfEOptions
    ]
]);
您也可以使用
或where()
,但最近它的行为有点脆弱

最后,可以使用表达式创建复杂条件。
表达式方法可用于创建
条件:

$schools->where(function ($expr) use ($arrayOfAOptions, $arrayOfBOptions) {
    return $expr->or_([
        'A IN' => $arrayOfAOptions,
        'B IN' => $arrayOfBOptions,
    ]);
});

另请参见

我们生活在2017年,您应该使用
['key'=>'value']
而不是古老的
数组()
,因为它在格式方面有很大帮助(除非您需要向后兼容(这里讲的是PHP<5.4,古老的,应该忘记))。至于你的问题,它似乎是可靠的,我没有答案给你。但是,在您完成研究后,请向上投票。这只是为了让您知道我在迁移到cake 3.0和PHP7之前做了什么