Я пытаюсь построить запрос в 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 как 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')
)
)
);
перед слиянием с остальными на условиях
Любая помощь будет оценена
Вы можете использовать тот же стиль, что и в CakePHP 2.x, т.е. передать свои условия, вложенные в OR
ключ. Вы также можете обернуть это в один where()
вызов.
$schools->where([
'A IN' => $arrayOfAOptions,
'B IN' => $arrayOfBOptions,
'C IN' => $arrayOfCOptions,
'OR' => [
'D IN' => $arrayOfDOptions,
'E IN' => $arrayOfEOptions
]
]);
Вы также можете использовать orWhere()
, но это устарело в последнее время его поведение довольно хрупкое.
Наконец, вы можете использовать выражения для создания сложных условий. or_()
метод выражения может быть использован для создания OR
условия:
$schools->where(function ($expr) use ($arrayOfAOptions, $arrayOfBOptions) {
return $expr->or_([
'A IN' => $arrayOfAOptions,
'B IN' => $arrayOfBOptions,
]);
});
Смотрите также Поваренная книга> Доступ к базе данных & ORM> Query Builder> Дополнительные условия
Других решений пока нет …