J'essaye 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 des expressions brutes, mais il y aura 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) ne sont 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();
Voici 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 (en particulier sous la portée JOIN). Est-il possible d'ajouter des conditions supplémentaires dans le cadre du JOIN?
Comment puis-je créer la même requête en utilisant le Générateur de requêtes de Laravel (si possible) Est-il préférable d'utiliser Eloquent, ou devrait-il rester avec DB :: select?
and arrival >= ? and arrival <= ? and departure >= ? and departure <= ?
placeAND ( r.arrival between ? and ? OR r.departure between ? and ? )
(veuillez noter laOR
clause). Cela ajoute des lignes supplémentaires au résultat qui ne devraient pas être là. Je suppose qu'il n'est pas possible de générer tous les types de conditions dans la jointure en utilisant QB.