生成房间预定重复,然后为每个预定查找空房间

时间:2018-08-11 19:34:52

标签: laravel eloquent

我正在Laravel 5.6中创建一个预订系统,通过该表格我可以获取预订详细信息和重复要求,通常是每周进行2年以上的预订(重复100次以上),然后我希望它返回每个日期可用房间列表。到目前为止,在该应用程序中,我可以生成重复项,并且可以为单个预订找到空房间,但是我想要一种有效的方法来查询可用房间的多个预订,而不必为每个重复性都进行一次查询。这可能吗?

房间空房查询:

    $AvailableRooms = Derpartment::where('id', $DepartmentID)->with(['Rooms' => function($Rooms) use ($StartTime, $EndTime)
    {
        $Rooms->whereDoesntHave('Clinics', function ($Clinics) use ($StartTime, $EndTime) {
            $Clinics->where(function($q) use ($StartTime, $EndTime)
            {
                $q->where( function($r) use ($StartTime, $EndTime)
                {
                    // Req Start before or equal to booked start & Req End is before booked End time
                    $r->where('StartTime', '>=', $StartTime);
                    $r->where('StartTime', '<', $EndTime);
                });
                $q->where( function($r)
                {
                    $r->where('ClinicStatus', '=', 1);
                    $r->orWhere('ClinicStatus', '=', 2);
                    $r->orWhere('ClinicStatus', '=', 4);
                });
            });
            $Clinics->orWhere(function($q) use ($StartTime, $EndTime)
            {
                $q->where( function($r) use ($StartTime, $EndTime)
                {
                    // Req Start is before booked end & Req End is after booked end
                    $r->where('EndTime', '>', $StartTime);
                    $r->where('EndTime', '<=', $EndTime);
                });
                $q->where( function($r)
                {
                    $r->where('ClinicStatus', '=', 1);
                    $r->orWhere('ClinicStatus', '=', 2);
                    $r->orWhere('ClinicStatus', '=', 4);
                });
            });
            $Clinics->orWhere(function($q) use ($StartTime, $EndTime)
            {
                $q->where( function($r) use ($StartTime, $EndTime)
                {
                    // Req Start equal or greater than Booked Start & Req End is
                    $r->where('StartTime', '<=', $StartTime);
                    $r->where('EndTime', ">=", $EndTime);
                });
                $q->where( function($r)
                {
                    $r->where('ClinicStatus', '=', 1);
                    $r->orWhere('ClinicStatus', '=', 2);
                    $r->orWhere('ClinicStatus', '=', 4);
                });
            });
        });
    }])->get();

ClinicStatus是我确定是否应包括诊所的方式(例如,数据库中的其他预订已取消)

使用SimShaun's Recurr完成重复生成器,从中我得到一个日期数组。

0 个答案:

没有答案