2016-05-03 44 views
1

我想在我的數據庫中保存兩個時間間隔。在那裏它將檢查數據庫,並且如果有人已經預訂了那個時間,它不會節省時間,而如果它是空的,則將節省用戶將作爲輸入提供的時間。php - laravel:如何處理數據庫中的時間重疊?

例如,用戶想要預定時間表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'); 
      } 

    } 

回答

0

,才能夠讓查詢閉包內訪問$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(); 

希望這有助於!

+0

我仍然可以預訂教室在一定時間這已經在db – Hola

+0

沒有必要說對不起兄弟,你只是幫助,這是你的偉大。但我不明白爲什麼你在上面的代碼,我也可以用相同的時間間隔教室。 – Hola

+0

我以爲你不希望能夠預訂一間已經預訂的課室。上述代碼將檢查當時是否已經預訂了教室。如果有它會返回一個大於1的計數。 –

1

時間重疊的規則很簡單(見here爲一個完整的圖形說明):

start1 < end2 AND end1 > start2 

所以,你的查詢可以是:

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