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