ฉันกำลังพยายามเพิ่มเงื่อนไขโดยใช้คิวรี 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 ได้หรือไม่?
ฉันจะสร้างแบบสอบถามเดียวกันโดยใช้ Query Builder ของ Laravel ได้อย่างไร (ถ้าเป็นไปได้) จะดีกว่าถ้าใช้ Eloquent หรือควรอยู่กับ DB :: select
and arrival >= ? and arrival <= ? and departure >= ? and departure <= ?
แทนAND ( r.arrival between ? and ? OR r.departure between ? and ? )
(โปรดสังเกตส่วนOR
คำสั่ง) สิ่งนี้จะเพิ่มแถวเพิ่มเติมเพื่อให้ได้ผลลัพธ์ที่ไม่ควรมี ฉันเดาว่าเป็นไปไม่ได้ที่จะสร้างเงื่อนไขทุกประเภทในการเข้าร่วมโดยใช้ QB