Existe um
orWhereBetween
disponível no Query Builder, mas não está documentado na Documentação do Query Builder . No entanto, você pode encontrá-lo na Documentação da API Laravel . As explicações abaixo assumem que as variáveis têm os seguintes valores:
$newStart = '1';
$newEnd = '10';
Infelizmente, usando
orWhereBetween
para a segunda condição não se aplica ao seu caso, porque tanto whereBetween
e orWhereBetween
irá verificar se um valor de coluna está entre dois valores de entrada. Isso é bom desde sua primeira condição, pois verifica se o existing_start
o valor da coluna está entre $newStart
e $newEnd
. Então isso é bom:->whereBetween('existing_start', [$newStart, $newEnd])
Como será compilado para:
WHERE `existing_start` BETWEEN '1' AND '10'
No entanto, sua segunda condição deseja verificar se um valor de entrada de
$newStart
está entre dois valores de coluna existing_start
e existing_end
, e não há nenhum método do Query Builder que faça isso. Então isso não vai funcionar:->orWhereBetween($newStart, ['existing_start', 'existing_end'])
Porque será compilado para:
OR `1` BETWEEN 'existing_start' AND 'existing_end'
Observe os backticks
`
em torno de 1
, por causa disso o MySQL tentará encontrar uma coluna chamada 1
e lançar um erro. Portanto, a melhor opção aqui é usar
orWhereRaw
com ligações como esta:DB::table('tbl')
->whereBetween('existing_start', [$newStart, $newEnd])
->orWhereRaw('? BETWEEN existing_start AND existing_end', [$newStart])
->get();
O
?
será substituído pelo valor de $newStart
que será devidamente citado e escapado para evitar injeção de SQL. Ou é claro que sempre há a opção de ter duas condições agrupadas que verificam os limites, o que seria equivalente ao seu
BETWEEN
doença:DB::table('tbl')
->whereBetween('existing_start', [$newStart, $newEnd])
->orWhere(function ($query) use ($newStart) {
$query->where('existing_start', '<=', $newStart);
$query->where('existing_end', '>=', $newStart);
})->get();
Que irá compilar para:
SELECT * FROM `tbl`
WHERE
`existing_start` BETWEEN '1' AND '10' OR
(`existing_start` <= '1' AND `existing_end` >= '1')