Има orWhereBetween
метод, наличен от Query Builder, но е недокументиран в Документацията на Query Builder . Можете обаче да го намерите в Документацията за API на Laravel .
Обясненията по-долу предполагат, че променливите имат следните стойности:
$newStart = '1';
$newEnd = '10';
За съжаление, с помощта на orWhereBetween
за второто условие не е приложимо във вашия случай, тъй като и двете whereBetween
и orWhereBetween
ще провери дали стойността на колона е между две входни стойности. Това е добре от първото ви условие, тъй като проверява дали existing_start
Стойността на колоната е между $newStart
и $newEnd
. Така че това е добре:
->whereBetween('existing_start', [$newStart, $newEnd])
Тъй като ще бъде компилиран в:
WHERE `existing_start` BETWEEN '1' AND '10'
Второто ви условие обаче иска да провери дали е въведена стойност от $newStart
е между две стойности на колони existing_start
и existing_end
, и няма метод на Query Builder, който да прави това. Така че това няма да работи:
->orWhereBetween($newStart, ['existing_start', 'existing_end'])
Тъй като ще бъде компилиран във:
OR `1` BETWEEN 'existing_start' AND 'existing_end'
Обърнете внимание на обратните отметки `
около 1
, поради това MySQL ще се опита да намери колона с име 1
и извежда грешка.
Така че най-добрият вариант тук е да използвате orWhereRaw
с връзки като това:
DB::table('tbl')
->whereBetween('existing_start', [$newStart, $newEnd])
->orWhereRaw('? BETWEEN existing_start AND existing_end', [$newStart])
->get();
?
ще бъде заменен със стойността на $newStart
които ще бъдат правилно цитирани и екранирани, за да се избегне SQL инжекция.
Или, разбира се, винаги има възможност да имате две групирани условия, които проверяват границите, което би било еквивалентно на вашето BETWEEN
условие:
DB::table('tbl')
->whereBetween('existing_start', [$newStart, $newEnd])
->orWhere(function ($query) use ($newStart) {
$query->where('existing_start', '<=', $newStart);
$query->where('existing_end', '>=', $newStart);
})->get();
Което ще се компилира в:
SELECT * FROM `tbl`
WHERE
`existing_start` BETWEEN '1' AND '10' OR
(`existing_start` <= '1' AND `existing_end` >= '1')