Det finns en orWhereBetween
metod tillgänglig från Query Builder, men den är odokumenterad i Query Builder-dokumentationen . Du kan dock hitta det i Laravel API-dokumentation .
Förklaringarna nedan förutsätter att variablerna har följande värden:
$newStart = '1';
$newEnd = '10';
Tyvärr använder du orWhereBetween
för det andra villkoret är inte tillämpligt i ditt fall, eftersom båda whereBetween
och orWhereBetween
kommer att kontrollera om ett kolumnvärde ligger mellan två indatavärden. Detta är bra från ditt första tillstånd eftersom det kontrollerar om existing_start
kolumnvärdet är mellan $newStart
och $newEnd
. Så det här är bra:
->whereBetween('existing_start', [$newStart, $newEnd])
Som det kommer att kompileras till:
WHERE `existing_start` BETWEEN '1' AND '10'
Men ditt andra villkor vill kontrollera om ett indatavärde från $newStart
är mellan två kolumnvärden existing_start
och existing_end
, och det finns ingen Query Builder-metod som gör det. Så det här kommer inte att fungera:
->orWhereBetween($newStart, ['existing_start', 'existing_end'])
Eftersom det kommer att kompileras till:
OR `1` BETWEEN 'existing_start' AND 'existing_end'
Lägg märke till backtickarna `
runt 1
, på grund av det kommer MySQL att försöka hitta en kolumn med namnet 1
och skapa ett fel.
Så det bästa alternativet här är att använda orWhereRaw
med bindningar så här:
DB::table('tbl')
->whereBetween('existing_start', [$newStart, $newEnd])
->orWhereRaw('? BETWEEN existing_start AND existing_end', [$newStart])
->get();
?
kommer att ersättas av värdet $newStart
som kommer att citeras korrekt och escaped för att undvika SQL-injektion.
Eller så finns det alltid alternativet att ha två grupperade villkor som kontrollerar gränserna, vilket skulle motsvara din BETWEEN
skick:
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 kommer att kompilera till:
SELECT * FROM `tbl`
WHERE
`existing_start` BETWEEN '1' AND '10' OR
(`existing_start` <= '1' AND `existing_end` >= '1')