Er is een orWhereBetween
methode beschikbaar in de Query Builder, maar niet gedocumenteerd in de Query Builder-documentatie . U kunt het echter vinden in de Laravel API-documentatie .
De onderstaande uitleg gaat ervan uit dat de variabelen de volgende waarden hebben:
$newStart = '1';
$newEnd = '10';
Helaas, met behulp van orWhereBetween
voor de tweede voorwaarde is in uw geval niet van toepassing, omdat zowel whereBetween
en orWhereBetween
zal controleren of een kolomwaarde tussen twee invoerwaarden ligt. Dit is prima vanaf je eerste voorwaarde, omdat het controleert of de existing_start
kolomwaarde ligt tussen $newStart
en $newEnd
. Dus dit is prima:
->whereBetween('existing_start', [$newStart, $newEnd])
Zoals het zal worden gecompileerd naar:
WHERE `existing_start` BETWEEN '1' AND '10'
Uw tweede voorwaarde wil echter controleren of een invoerwaarde van $newStart
is tussen twee kolomwaarden existing_start
en existing_end
, en er is geen Query Builder-methode die dat doet. Dit werkt dus niet:
->orWhereBetween($newStart, ['existing_start', 'existing_end'])
Omdat het wordt gecompileerd om:
OR `1` BETWEEN 'existing_start' AND 'existing_end'
Let op de backticks `
rond 1
, daarom zal MySQL proberen een kolom te vinden met de naam 1
en gooi een fout.
Dus de beste optie hier is om orWhereRaw
. te gebruiken met bindingen als deze:
DB::table('tbl')
->whereBetween('existing_start', [$newStart, $newEnd])
->orWhereRaw('? BETWEEN existing_start AND existing_end', [$newStart])
->get();
De ?
wordt vervangen door de waarde van $newStart
die correct wordt geciteerd en ontsnapt om SQL-injectie te voorkomen.
Of er is natuurlijk altijd de mogelijkheid om twee gegroepeerde voorwaarden te hebben die de grenzen controleren, wat gelijk zou zijn aan uw BETWEEN
staat:
DB::table('tbl')
->whereBetween('existing_start', [$newStart, $newEnd])
->orWhere(function ($query) use ($newStart) {
$query->where('existing_start', '<=', $newStart);
$query->where('existing_end', '>=', $newStart);
})->get();
Die zal compileren naar:
SELECT * FROM `tbl`
WHERE
`existing_start` BETWEEN '1' AND '10' OR
(`existing_start` <= '1' AND `existing_end` >= '1')