我正在尝试使用以下结构在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')
)
)
);
在将条件合并到其余部分之前 任何帮助将不胜感激
答案 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