J'essaie d'ajouter une condition en utilisant une requête JOIN avec 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')
);
Je sais que je peux utiliser Expressions brutes mais il y aura alors des points d'injection SQL. J'ai essayé ce qui suit avec Query Builder mais la requête générée (et évidemment, les résultats de la requête) n'est pas ce que je voulais :
$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();
C'est la requête générée par 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
Comme vous pouvez le voir, la sortie de la requête n'a pas la structure (surtout sous la portée JOIN). Est-il possible d'ajouter des conditions supplémentaires sous le JOIN ?
Comment puis-je construire la même requête en utilisant le Query Builder de Laravel (si possible) ? Est-il préférable d'utiliser Eloquent, ou faut-il rester avec DB::select ?