Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Laravel 5 usando condição OR com BETWEEN


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