আমি লারাভেল কোয়েরি বিল্ডারের সাথে একটি 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();
এটি লারাভেলের উত্পন্ন উত্স:
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 স্কোপের অধীনে)। জোনের অধীনে অতিরিক্ত শর্ত যুক্ত করা কি সম্ভব?
লারাভেলের ক্যোয়ারী বিল্ডার ব্যবহার করে আমি কীভাবে একই ক্যোয়ারীটি তৈরি করতে পারি (যদি সম্ভব হয়) তবে এলওলিউড ব্যবহার করা আরও ভাল, বা ডিবি :: এর সাথে থাকা উচিত?
and arrival >= ? and arrival <= ? and departure >= ? and departure <= ?
পরিবর্তিত হয়েছেAND ( r.arrival between ? and ? OR r.departure between ? and ? )
(দয়া করেOR
অনুচ্ছেদটি লক্ষ্য করুন )। এটি এমন ফলাফলের জন্য অতিরিক্ত সারি যুক্ত করে যা সেখানে না থাকা উচিত। আমার ধারণা, কিউবি ব্যবহার করে যোগদানের ক্ষেত্রে সমস্ত ধরণের শর্ত তৈরি করা সম্ভব নয়।