Как выразить условия OR с помощью построителя запросов 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' => $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

Решение

Вы можете использовать тот же стиль, что и в 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> Дополнительные условия

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector