如何用CakePHP 3.x查询构建器表达OR条件?

时间:2017-08-20 01:52:56

标签: php cakephp conditional-statements query-builder cakephp-3.x

我正在尝试使用以下结构在cakephp 3.X中构建一个查询:  A和B和C以及[D或E]其中A,B,C,D,E包含与OR条件相连的值数组,如

$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作为OR隔离并与AND加入其他

在cakephp 2中,我设法用以下代码实现它

$queryConditions = array(
  'or'=> array_merge(
    array(
      'School.D' =>  $this->Session->read('conditions.D')
    ), 
    array(
      'School.E' => $this->Session->read('conditions.E')
    )
  )
);

在将条件合并到其余部分之前 任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

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

$schools->where([
    'A IN' => $arrayOfAOptions,
    'B IN' => $arrayOfBOptions,
    'C IN' => $arrayOfCOptions,
    'OR' => [
        'D IN' => $arrayOfDOptions,
        'E IN' => $arrayOfEOptions
    ]
]);

您最近也可以使用orWhere(),但it has been deprecated,因为它的行为有点脆弱。

最后,您可以使用表达式来创建复杂的条件。 or_()表达式方法可用于创建OR条件:

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

另请参阅 Cookbook > Database Access & ORM > Query Builder > Advanced Conditions