मैं लारवेल क्वेरी बिल्डर के साथ JOIN क्वेरी का उपयोग करके एक शर्त जोड़ने की कोशिश कर रहा हूं।
<?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')
);
मुझे पता है कि मैं रॉ एक्सप्रेशन का उपयोग कर सकता हूं लेकिन फिर एसक्यूएल इंजेक्शन पॉइंट होंगे। मैंने क्वेरी बिल्डर के साथ निम्नलिखित की कोशिश की है, लेकिन उत्पन्न क्वेरी (और जाहिर है, क्वेरी परिणाम) वह नहीं है जो मेरा इरादा था:
$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 के तहत अतिरिक्त शर्तें जोड़ना संभव है?
मैं लारवेल के क्वेरी बिल्डर का उपयोग करके एक ही क्वेरी कैसे बना सकता हूं (यदि संभव हो) क्या एलक्वेंट का उपयोग करना बेहतर है, या डीबी के साथ रहना चाहिए :: चयन?
and arrival >= ? and arrival <= ? and departure >= ? and departure <= ?
बजायAND ( r.arrival between ? and ? OR r.departure between ? and ? )
(कृपयाOR
क्लॉज़ नोटिस करें )। यह परिणामी पंक्तियों को जोड़ता है जो कि नहीं होना चाहिए। मुझे लगता है कि QB का उपयोग करके सभी प्रकार की स्थितियों को उत्पन्न करना संभव नहीं है।