Istnieje orWhereBetween
metoda dostępna z Konstruktora zapytań, ale nie jest udokumentowana w Dokumentacji Konstruktora zapytań . Możesz go jednak znaleźć w Dokumentacji Laravel API .
Poniższe wyjaśnienia zakładają, że zmienne mają następujące wartości:
$newStart = '1';
$newEnd = '10';
Niestety, używając orWhereBetween
dla drugiego warunku nie ma zastosowania w twoim przypadku, ponieważ oba whereBetween
i orWhereBetween
sprawdzi, czy wartość w kolumnie znajduje się między dwiema wartościami wejściowymi. Jest to w porządku od pierwszego warunku, ponieważ sprawdza, czy existing_start
wartość kolumny jest między $newStart
i $newEnd
. Więc to jest w porządku:
->whereBetween('existing_start', [$newStart, $newEnd])
Ponieważ zostanie skompilowany do:
WHERE `existing_start` BETWEEN '1' AND '10'
Jednak twój drugi warunek chce sprawdzić, czy wartość wejściowa z $newStart
znajduje się między dwiema wartościami kolumny existing_start
i existing_end
, a nie istnieje metoda konstruktora zapytań, która to robi. Więc to nie zadziała:
->orWhereBetween($newStart, ['existing_start', 'existing_end'])
Ponieważ zostanie skompilowany do:
OR `1` BETWEEN 'existing_start' AND 'existing_end'
Zwróć uwagę na znaki `
wokół 1
, dlatego MySQL spróbuje znaleźć kolumnę o nazwie 1
i wyrzuć błąd.
Więc najlepszą opcją jest użycie orWhereRaw
z takimi wiązaniami:
DB::table('tbl')
->whereBetween('existing_start', [$newStart, $newEnd])
->orWhereRaw('? BETWEEN existing_start AND existing_end', [$newStart])
->get();
?
zostanie zastąpiona wartością $newStart
które zostaną prawidłowo zacytowane i zmienione, aby uniknąć wstrzyknięcia SQL.
Oczywiście zawsze istnieje możliwość posiadania dwóch zgrupowanych warunków, które sprawdzają granice, co odpowiadałoby twojemu BETWEEN
warunek:
DB::table('tbl')
->whereBetween('existing_start', [$newStart, $newEnd])
->orWhere(function ($query) use ($newStart) {
$query->where('existing_start', '<=', $newStart);
$query->where('existing_end', '>=', $newStart);
})->get();
Który skompiluje się do:
SELECT * FROM `tbl`
WHERE
`existing_start` BETWEEN '1' AND '10' OR
(`existing_start` <= '1' AND `existing_end` >= '1')