Saya mencoba menambahkan kondisi menggunakan kueri JOIN dengan 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')
);
Saya tahu saya dapat menggunakan Ekspresi Mentah tetapi kemudian akan ada titik injeksi SQL. Saya telah mencoba yang berikut ini dengan Query Builder tetapi kueri yang dihasilkan (dan jelas, hasil kueri) tidak seperti yang saya inginkan:
$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();
Ini adalah kueri yang dihasilkan oleh 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
Seperti yang Anda lihat, output kueri tidak memiliki struktur (terutama di bawah cakupan JOIN). Apakah mungkin untuk menambahkan ketentuan tambahan di bawah JOIN?
Bagaimana saya bisa membangun kueri yang sama menggunakan Laravel's Query Builder (jika mungkin) Apakah lebih baik menggunakan Eloquent, atau harus tetap dengan DB :: select?
and arrival >= ? and arrival <= ? and departure >= ? and departure <= ?
bukanAND ( r.arrival between ? and ? OR r.departure between ? and ? )
(silakan perhatikanOR
klausa). Ini menambahkan baris tambahan ke hasil yang seharusnya tidak ada. Saya kira tidak mungkin untuk menghasilkan semua jenis kondisi dalam bergabung menggunakan QB.