我正在从事公寓租赁项目。作为应用程序功能的一部分,公寓业主可以选择公寓可供客人出租的日期。我正在编写一个搜索查询来获取公寓,其中它会检查可出租的天数。我有以下表格:房间、预订、天数、day_room(数据透视表)。由于我是新来的,如果我需要发布其他内容以便您更好地了解我的问题,请告诉我。
在这个查询中,当我在最后一个Where方法中写入静态日期(例如'2024-06-27')时,它会很好地工作并产生所需的结果,但是当使用 $date->format('Y-m-d') 时它没有找到任何东西。然而,在生成的 SQL 查询中,我没有看到有任何差异,即日期格式。
namespace App\Http\Controllers;
use App\Models\Room;
use App\Models\Booking;
use Carbon\CarbonPeriod;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class SearchController extends Controller
{
public function index()
{
// Validate data later
$city = request('city');
$guests_number = request('guests_number');
$object_type = request('object_type');
$checkIn = request('checkIn');
$checkOut = request('checkOut');
$interval = CarbonPeriod::create($checkIn, $checkOut);
$rooms = Room::query()
->with(['photos', 'bookings', 'days'])
->where('rooms.city_id', '=', $city)
->where('rooms.beds_num', '>=', $guests_number)
->where('rooms.object_type_id', '=', $object_type)
->join('bookings', 'bookings.room_id', '=',
'rooms.id')
->where(function ($query) use ($checkIn, $checkOut) {
$query->where('checkIn', '>=', $checkOut)
->orWhere('checkOut', '<=', $checkIn);
})
->whereExists(function ($query) use ($interval) {
$query
->from('day_room')
->join('days', 'days.id', '=', 'day_room.day_id')
->whereColumn('day_room.room_id', 'rooms.id')
->where(function ($query) use ($interval) {
foreach ($interval as $date) {
$query->where('days.day', '=', $date->format('Y-m-d'));
// when testing if I write static date like here, then it works.
// $query->where('days.day', '=', '2024-06-27');
}
});
})
->get('rooms.*');
return view('results', ['rooms' => $rooms]);
}
感谢大家在评论部分的反馈。 @Rene 和 @Tupkap 让我思考了一个正确的方向 - 我正在检查一个单元格的多天。我通过移动 foreach 循环解决了这个问题。下面是对我有用的代码的编辑版本。我想这不是解决问题的最优雅的方法,但因为公寓不适合长期预订(通常是几天,不超过 1-2 周)。
namespace App\Http\Controllers;
use App\Models\Room;
use App\Models\Booking;
use Carbon\CarbonPeriod;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class SearchController extends Controller
{
public function index()
{
// Validate data later
$city = request('city');
$guests_number = request('guests_number');
$object_type = request('object_type');
$checkIn = request('checkIn');
$checkOut = request('checkOut');
$interval = CarbonPeriod::create($checkIn, $checkOut);
$rooms = Room::query()
->with(['photos', 'bookings', 'days'])
->where('rooms.city_id', '=', $city)
->where('rooms.beds_num', '>=', $guests_number)
->where('rooms.object_type_id', '=', $object_type)
->join('bookings', 'bookings.room_id', '=', 'rooms.id')
->where(function ($query) use ($checkIn, $checkOut) {
$query->where('checkIn', '>=', $checkOut)
->orWhere('checkOut', '<=', $checkIn);
})
->where(function ($query) use ($interval) {
foreach ($interval as $date) {
$query->whereExists(function ($query) use ($date) {
$query
->from('day_room')
->join('days', 'days.id', '=', 'day_room.day_id')
->whereColumn('day_room.room_id', 'rooms.id')
->where('days.day', '=', $date->format('Y-m-d'));
});
}
})
->get('rooms.*');
return view('results', ['rooms' => $rooms]);
}