Hay un orWhereBetween disponible en Query Builder, pero no está documentado en la Query Builder Documentation . Sin embargo, puede encontrarlo en la Documentación de la API de Laravel .
Las explicaciones a continuación asumen que las variables tienen los siguientes valores:
$newStart = '1';
$newEnd = '10';
Desafortunadamente, usando orWhereBetween porque la segunda condición no es aplicable en su caso, porque tanto whereBetween y orWhereBetween comprobará si un valor de columna está entre dos valores de entrada. Esto está bien desde su primera condición, ya que comprueba si existing_start el valor de la columna está entre $newStart y $newEnd . Así que esto está bien:
->whereBetween('existing_start', [$newStart, $newEnd])
Como se compilará a:
WHERE `existing_start` BETWEEN '1' AND '10'
Sin embargo, su segunda condición quiere verificar si un valor de entrada de $newStart está entre dos valores de columna existing_start y existing_end , y no hay ningún método Query Builder que haga eso. Así que esto no funcionará:
->orWhereBetween($newStart, ['existing_start', 'existing_end'])
Porque se compilará para:
OR `1` BETWEEN 'existing_start' AND 'existing_end'
Observe los acentos graves ` alrededor de 1 , por eso MySQL intentará encontrar una columna llamada 1 y lanza un error.
Entonces, la mejor opción aquí es usar orWhereRaw con enlaces como este:
DB::table('tbl')
->whereBetween('existing_start', [$newStart, $newEnd])
->orWhereRaw('? BETWEEN existing_start AND existing_end', [$newStart])
->get();
El ? será reemplazado por el valor de $newStart que se citará correctamente y escapará para evitar la inyección de SQL.
O, por supuesto, siempre existe la opción de tener dos condiciones agrupadas que verifiquen los límites, lo que sería equivalente a su BETWEEN condición:
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 compilará a:
SELECT * FROM `tbl`
WHERE
`existing_start` BETWEEN '1' AND '10' OR
(`existing_start` <= '1' AND `existing_end` >= '1')