Mysql
 sql >> Database >  >> RDS >> Mysql

Laravel 5 usando la condizione OR con BETWEEN

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