Има 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')