برای دستیابی به نتایج دقیقتر و ایجاد شروط تو در تو، در لاراول میتوانیم از clouser استفاده کنیم و با استفاده از sub query به اطلاعات مورد نظرمان دسترسی پیدا کنیم.
در سناریوی زیر من قصد دارم از یک جدول اتاقهایی را انتخاب کنم که در بازهی تاریخی تعیین شده، قرار گرفته باشند و شماره اتاقشان با شماره اتاق درخواستی من یکی باشد. پس به صورت زیر عمل میکنم:
Reserve::select('id', 'from', 'till', 'room_number')
->where('room_number', $request->room_number)
->where(function ($query) {
$query->whereBetween('from', $start, $end])
->orWhereBetween('till', $start, $end);
})
->get();
اما اگر قصد داشته باشیم متغیرهایی را دریافت و با فیلدهای مورد نظر مقایسه کنیم، از روش زیر و use کردن request یا متغیر خود استفاده میکنیم تا نتیجه درستی به دست آید.
Reserve::select('id', 'from', 'till', 'room_number')
->where('room_number', $request->room_number)
->where(function ($query) use ($request) {
$query->whereBetween('from', [$request->from, $request->till])
->orWhereBetween('till', [$request->from, $request->till]);
})
->get();
حتی نمونهی زیر نیز یک نمونهی ساده و واضح است که اگر نتیجهی کوئری بیشتر از ۰ بود، به این منزله است که اتاق رزرو شده است:
$exists = Reserve::where('room_number', $request->room_number)
->where(function ($query) use ($from, $till) {
$query->whereBetween('from', [$from, $till])
->orWhereBetween('till', [$from, $till]);
})
->count();