Existuje orWhereBetween
metoda dostupná z Tvůrce dotazů, ale není zdokumentována v dokumentaci k Tvůrci dotazů . Můžete jej však najít v dokumentaci Laravel API .
Níže uvedená vysvětlení předpokládají, že proměnné mají následující hodnoty:
$newStart = '1';
$newEnd = '10';
Bohužel pomocí orWhereBetween
druhá podmínka není ve vašem případě použitelná, protože obě whereBetween
a orWhereBetween
zkontroluje, zda je hodnota sloupce mezi dvěma vstupními hodnotami. To je v pořádku od vaší první podmínky, protože kontroluje, zda existing_start
hodnota sloupce je mezi $newStart
a $newEnd
. Takže je to v pořádku:
->whereBetween('existing_start', [$newStart, $newEnd])
Jak bude zkompilován do:
WHERE `existing_start` BETWEEN '1' AND '10'
Vaše druhá podmínka však chce zkontrolovat, zda je vstupní hodnota z $newStart
je mezi dvěma hodnotami sloupce existing_start
a existing_end
a neexistuje žádná metoda Query Builder, která by to dělala. Takže to nebude fungovat:
->orWhereBetween($newStart, ['existing_start', 'existing_end'])
Protože bude zkompilován do:
OR `1` BETWEEN 'existing_start' AND 'existing_end'
Všimněte si zpětných znamének `
kolem 1
, kvůli tomu se MySQL pokusí najít sloupec s názvem 1
a vyvolá chybu.
Nejlepší možností je tedy použít orWhereRaw
s vázáním jako je toto:
DB::table('tbl')
->whereBetween('existing_start', [$newStart, $newEnd])
->orWhereRaw('? BETWEEN existing_start AND existing_end', [$newStart])
->get();
?
bude nahrazeno hodnotou $newStart
které budou správně citovány a uvozeny, aby se zabránilo vkládání SQL.
Nebo samozřejmě vždy existuje možnost mít dvě seskupené podmínky, které kontrolují hranice, což by bylo ekvivalentní vašemu BETWEEN
podmínka:
DB::table('tbl')
->whereBetween('existing_start', [$newStart, $newEnd])
->orWhere(function ($query) use ($newStart) {
$query->where('existing_start', '<=', $newStart);
$query->where('existing_end', '>=', $newStart);
})->get();
Které se zkompilují do:
SELECT * FROM `tbl`
WHERE
`existing_start` BETWEEN '1' AND '10' OR
(`existing_start` <= '1' AND `existing_end` >= '1')