Mysql
 sql >> Base de données >  >> RDS >> Mysql

Laravel 5 utilisant la condition OR avec BETWEEN

Il y a un orWhereBetween méthode disponible à partir du générateur de requêtes, mais elle n'est pas documentée dans la documentation du générateur de requêtes . Vous pouvez cependant le trouver dans la Laravel API Documentation .

Les explications ci-dessous supposent que les variables ont les valeurs suivantes :

$newStart = '1';
$newEnd = '10';

Malheureusement, en utilisant orWhereBetween pour la deuxième condition n'est pas applicable dans votre cas, car les deux whereBetween et orWhereBetween vérifiera si une valeur de colonne est comprise entre deux valeurs d'entrée. C'est très bien à partir de votre première condition car il vérifie si le existing_start la valeur de la colonne est comprise entre $newStart et $newEnd . Donc c'est bien :

->whereBetween('existing_start', [$newStart, $newEnd])

Comme il sera compilé pour :

WHERE `existing_start` BETWEEN '1' AND '10'

Cependant, votre deuxième condition veut vérifier si une valeur d'entrée de $newStart est entre deux valeurs de colonne existing_start et existing_end , et il n'y a pas de méthode Query Builder qui le fasse. Cela ne fonctionnera donc pas :

->orWhereBetween($newStart, ['existing_start', 'existing_end'])

Parce qu'il sera compilé pour :

OR `1` BETWEEN 'existing_start' AND 'existing_end'

Remarquez les backticks ` environ 1 , à cause de cela MySQL essaiera de trouver une colonne nommée 1 et renvoie une erreur.

Donc, la meilleure option ici est d'utiliser orWhereRaw avec des liaisons comme celle-ci :

DB::table('tbl')
  ->whereBetween('existing_start', [$newStart, $newEnd])
  ->orWhereRaw('? BETWEEN existing_start AND existing_end', [$newStart])
  ->get();

Le ? sera remplacé par la valeur de $newStart qui sera correctement entre guillemets et échappé pour éviter l'injection SQL.

Ou bien sûr, il y a toujours la possibilité d'avoir deux conditions groupées qui vérifient les limites, ce qui équivaudrait à votre BETWEEN condition :

DB::table('tbl')
  ->whereBetween('existing_start', [$newStart, $newEnd])
  ->orWhere(function ($query) use ($newStart) {
      $query->where('existing_start', '<=', $newStart);
      $query->where('existing_end', '>=', $newStart);
  })->get();

Qui se compilera en :

SELECT * FROM `tbl`
WHERE
  `existing_start` BETWEEN '1' AND '10' OR
  (`existing_start` <= '1' AND `existing_end` >= '1')