Der er en orWhereBetween
metode tilgængelig fra Query Builder, men den er udokumenteret i Query Builder-dokumentationen . Du kan dog finde det i Laravel API-dokumentation .
Forklaringerne nedenfor antager, at variablerne har følgende værdier:
$newStart = '1';
$newEnd = '10';
Desværre ved at bruge orWhereBetween
for den anden betingelse er ikke relevant i dit tilfælde, fordi begge whereBetween
og orWhereBetween
vil kontrollere, om en kolonneværdi er mellem to inputværdier. Dette er fint fra din første betingelse, da det tjekker om existing_start
kolonneværdien er mellem $newStart
og $newEnd
. Så det er fint:
->whereBetween('existing_start', [$newStart, $newEnd])
Som det vil blive kompileret til:
WHERE `existing_start` BETWEEN '1' AND '10'
Din anden betingelse ønsker dog at kontrollere, om en inputværdi fra $newStart
er mellem to kolonneværdier existing_start
og existing_end
, og der er ingen Query Builder-metode, der gør det. Så dette vil ikke virke:
->orWhereBetween($newStart, ['existing_start', 'existing_end'])
Fordi det vil blive kompileret til:
OR `1` BETWEEN 'existing_start' AND 'existing_end'
Læg mærke til backtikkene `
omkring 1
, på grund af det vil MySQL forsøge at finde en kolonne med navnet 1
og smid en fejl.
Så den bedste mulighed her er at bruge orWhereRaw
med bindinger som denne:
DB::table('tbl')
->whereBetween('existing_start', [$newStart, $newEnd])
->orWhereRaw('? BETWEEN existing_start AND existing_end', [$newStart])
->get();
$newStart
som vil blive korrekt citeret og escaped for at undgå SQL-injektion.
Eller selvfølgelig er der altid mulighed for at have to grupperede forhold, der kontrollerer grænserne, hvilket ville svare til din BETWEEN
tilstand:
DB::table('tbl')
->whereBetween('existing_start', [$newStart, $newEnd])
->orWhere(function ($query) use ($newStart) {
$query->where('existing_start', '<=', $newStart);
$query->where('existing_end', '>=', $newStart);
})->get();
Som vil kompilere til:
SELECT * FROM `tbl`
WHERE
`existing_start` BETWEEN '1' AND '10' OR
(`existing_start` <= '1' AND `existing_end` >= '1')