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')