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