Ich versuche, eine Bedingung mithilfe einer JOIN-Abfrage mit Laravel Query Builder hinzuzufügen.
<?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')
);
Ich weiß, dass ich Raw Expressions verwenden kann, aber dann gibt es SQL-Injection-Punkte. Ich habe mit Query Builder Folgendes versucht, aber die generierte Abfrage (und natürlich die Abfrageergebnisse) sind nicht das, was ich beabsichtigt habe:
$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();
Dies ist die von Laravel generierte Abfrage:
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
Wie Sie sehen können, hat die Abfrageausgabe nicht die Struktur (insbesondere im Bereich JOIN). Ist es möglich, unter JOIN zusätzliche Bedingungen hinzuzufügen?
Wie kann ich dieselbe Abfrage mit Laravels Query Builder erstellen (falls möglich)? Ist es besser, Eloquent zu verwenden, oder sollte ich bei DB :: select bleiben?
and arrival >= ? and arrival <= ? and departure >= ? and departure <= ?
stattdessen die Join-Bedingung giltAND ( r.arrival between ? and ? OR r.departure between ? and ? )
(beachten Sie dieOR
Klausel). Dies fügt zusätzliche Zeilen hinzu, die nicht vorhanden sein sollten. Ich denke, es ist nicht möglich, alle Arten von Bedingungen in Join mit QB zu generieren.