C'è un orWhereBetween
metodo disponibile da Query Builder, ma non è documentato nella Documentazione Query Builder . Puoi tuttavia trovarlo nella Documentazione API Laravel .
Le spiegazioni seguenti presuppongono che le variabili abbiano i seguenti valori:
$newStart = '1';
$newEnd = '10';
Sfortunatamente, usando orWhereBetween
per la seconda condizione non è applicabile nel tuo caso, perché sia whereBetween
e orWhereBetween
verificherà se un valore di colonna è compreso tra due valori di input. Questo va bene dalla tua prima condizione poiché controlla se il existing_start
il valore della colonna è compreso tra $newStart
e $newEnd
. Quindi va bene:
->whereBetween('existing_start', [$newStart, $newEnd])
Come verrà compilato in:
WHERE `existing_start` BETWEEN '1' AND '10'
Tuttavia, la tua seconda condizione vuole verificare se un valore di input da $newStart
è compreso tra due valori di colonna existing_start
e existing_end
e non esiste un metodo Query Builder che lo faccia. Quindi questo non funzionerà:
->orWhereBetween($newStart, ['existing_start', 'existing_end'])
Perché verrà compilato in:
OR `1` BETWEEN 'existing_start' AND 'existing_end'
Nota i backtick `
intorno a 1
, per questo MySQL cercherà di trovare una colonna denominata 1
e genera un errore.
Quindi l'opzione migliore qui è usare orWhereRaw
con attacchi come questo:
DB::table('tbl')
->whereBetween('existing_start', [$newStart, $newEnd])
->orWhereRaw('? BETWEEN existing_start AND existing_end', [$newStart])
->get();
Il ?
sarà sostituito dal valore di $newStart
che verrà opportunamente quotato e sottoposto a escape per evitare l'iniezione di SQL.
Oppure c'è sempre la possibilità di avere due condizioni raggruppate che controllano i confini, che sarebbero equivalenti al tuo BETWEEN
condizione:
DB::table('tbl')
->whereBetween('existing_start', [$newStart, $newEnd])
->orWhere(function ($query) use ($newStart) {
$query->where('existing_start', '<=', $newStart);
$query->where('existing_end', '>=', $newStart);
})->get();
Che verrà compilato in:
SELECT * FROM `tbl`
WHERE
`existing_start` BETWEEN '1' AND '10' OR
(`existing_start` <= '1' AND `existing_end` >= '1')