Я пытаюсь добавить условие, используя запрос JOIN с 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')
);
Я знаю, что могу использовать Raw Expressions, но тогда будут точки SQL-инъекций. Я пробовал следующее с Query Builder, но сгенерированный запрос (и, очевидно, результаты запроса) не то, что я планировал:
$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();
Это сгенерированный запрос 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
Как видите, выходные данные запроса не имеют структуры (особенно в области JOIN). Можно ли добавить дополнительные условия под JOIN?
Как я могу создать тот же запрос с помощью Laravel Query Builder (если возможно). Лучше использовать Eloquent или следует остаться с DB :: select?
and arrival >= ? and arrival <= ? and departure >= ? and departure <= ?
вместо него теперь используется условие соединенияAND ( r.arrival between ? and ? OR r.departure between ? and ? )
(обратите внимание на этоOR
предложение). Это добавляет к результату дополнительные строки, которых там не должно быть. Я предполагаю, что с помощью QB невозможно сгенерировать все типы условий при объединении.