И условие, сопровождаемое ИЛИ между МЕЖДУ в CakePHP 3.4x
Что я пытаюсь получить:
SELECT col,col,col FROM x WHERE id = :c0 AND ((colx BETWEEN :c1 AND :c2) OR (colx BETWEEN :c3 AND :c4))
Что я пробовал:
$finalList = $finalList->find()->where(['id' => $id]);
foreach($dataArray as $y):
$finalList = $finalList->orWhere(function($expressions) use ($y['min'], $y['max']) {
return $expressions->between('colx', $y['min'], $y['max']);
}
endforeach;
Что я получаю:
SELECT col,col,col FROM x WHERE id = :c0 OR colx BETWEEN :c1 AND :c2 OR colx BETWEEN :c3 AND :c4
Я хочу, чтобы идентификатор был обязательным и ИЛИ между
1 ответ
Решение
Вот как orWhere()
работает. Цитата из документации API:
Важно отметить, что при вызове этой функции любой предыдущий набор условий, определенных для этого запроса, будет рассматриваться как один аргумент для оператора OR. Эта функция будет управлять не только последним определенным условием, но и всеми условиями в целом.
Это не слишком прямолинейно, поэтому orWhere()
Недавно был объявлен устаревшим.
Чтобы заставить это работать, используя orWhere()
, вам придется применить where()
(или же andWhere()
) после orWhere()
т.е.
$finalList = $finalList->find();
foreach($dataArray as $y) {
// ... apply orWhere()
}
$finalList->where(['id' => $id]);
В качестве альтернативы используйте конструктор выражений:
$finalList = $finalList->where(function ($exp) use ($dataArray) {
$or = $exp->or_([]);
foreach($dataArray as $y) {
$or->between('colx', $y['min'], $y['max']);
}
return $exp->add(['id' => 1, $or]);
});
Смотрите также