簡體   English   中英

php - laravel:如何處理數據庫中的時間重疊?

[英]php - laravel : How to handle time overlapping in database?

我想在我的數據庫中保存兩個時間間隔。 它將檢查數據庫,如果有人已經預訂了那個時間,它不會節省時間,而如果它是空的,它將節省用戶將作為輸入提供的時間。

例如。 用戶想要預訂 8:00 到 8:30 的時間表,同時保存到數據庫中,它會在數據庫中檢查是否有人已經占用了該時間,如果沒有,則將保存,否則不會。 同時用戶即使在 8:15 也無法輸入。

我如何解決這個重疊問題?

這是我使用的控制器代碼,但它沒有運行:

 public function postAllocateRoom(Request $request)
    {

            $classRoom = new ClassRoom();  

            $classRoom->department_id=$request->Input(['department_id']);     
            $classRoom->room_id=$request->Input(['room_id']); 
            $classRoom->course_id=$request->Input(['course_id']); 
            $classRoom->day_id=$request->Input(['day_id']); 
            $classRoom->start=$request->Input(['start']); 
            $classRoom->end=$request->Input(['end']);  

            $startTime = Carbon::parse($request->input('start'));
            $endTime = Carbon::parse($request->input('end'));

            $classRoomCount = ClassRoom::where(function ($query) {
                     $query->where('start', '>=', $startTime)
                        ->where('end', '<=', $startTime); })->count();

            $messages ="Class Room Already Taken";
            if ($classRoomCount > 0) {
             return redirect('allocateRoomPage',$message);
                    }
            else {
                 $classRoom->save();            
            return redirect('allocateRoomPage'); 
            }

    }

時間重疊的規則很簡單(請參閱此處以獲取完整的圖形說明):

start1 < end2   AND   end1 > start2

所以你的查詢可以是:

$classRoomCount = ClassRoom::where
(
    function( $query ) use( $startTime, $endTime )
    {
        $query->where( 'start', '<', $endTime )
              ->where( 'end', '>', $startTime); 
    }
)->count();

首先,為了能夠在查詢閉包中訪問$startTime$endTime ,您需要使用use構造傳遞它們,即

function ($query) use ($startTime, $endTime)

以下應該有助於獲得在特定時間之間預訂的教室的正確計數:

$classRoomCount = ClassRoom::where(function ($query) use ($startTime, $endTime) {

    $query
        ->where(function ($query) use ($startTime, $endTime) {
            $query
                ->where('start', '>=', $startTime)
                ->where('end', '<', $startTime);
        })
        ->orWhere(function ($query) use ($startTime, $endTime) {
            $query
                ->where('start', '<', $endTime)
                ->where('end', '>=', $endTime);
        });
})->count();

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM