Estoy tratando de agregar una condición usando una consulta JOIN con Laravel Query Builder.
<?php
$results = DB::select('
SELECT DISTINCT
*
FROM
rooms
LEFT JOIN bookings
ON rooms.id = bookings.room_type_id
AND ( bookings.arrival between ? and ?
OR bookings.departure between ? and ? )
WHERE
bookings.room_type_id IS NULL
LIMIT 20',
array('2012-05-01', '2012-05-10', '2012-05-01', '2012-05-10')
);
Sé que puedo usar Raw Expressions, pero luego habrá puntos de inyección SQL. Probé lo siguiente con Query Builder, pero la consulta generada (y obviamente, los resultados de la consulta) no son lo que pretendía:
$results = DB::table('rooms')
->distinct()
->leftJoin('bookings', function ($join) {
$join->on('rooms.id', '=', 'bookings.room_type_id');
})
->whereBetween('arrival', array('2012-05-01', '2012-05-10'))
->whereBetween('departure', array('2012-05-01', '2012-05-10'))
->where('bookings.room_type_id', '=', null)
->get();
Esta es la consulta generada por Laravel:
select distinct * from `room_type_info`
left join `bookings`
on `room_type_info`.`id` = `bookings`.`room_type_id`
where `arrival` between ? and ?
and `departure` between ? and ?
and `bookings`.`room_type_id` is null
Como puede ver, la salida de la consulta no tiene la estructura (especialmente bajo el alcance JOIN). ¿Es posible agregar condiciones adicionales en JOIN?
¿Cómo puedo construir la misma consulta usando el Generador de consultas de Laravel (si es posible)? ¿Es mejor usar Eloquent, o debería quedarse con DB :: select?
and arrival >= ? and arrival <= ? and departure >= ? and departure <= ?
lugarAND ( r.arrival between ? and ? OR r.departure between ? and ? )
(observe laOR
cláusula). Esto agrega filas adicionales al resultado que no debería estar allí. Supongo que no es posible generar todos los tipos de condiciones en unir usando QB.