2016-05-03 15 views
1

データベースに2つの時間間隔を保存します。そこではデータベースをチェックし、誰かがすでにその時間を予約していればそれは時間を節約しませんが、空であればユーザーが入力として与える時間を節約します。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へのアクセス権を持つことができるように

:以下は、特定の時間帯の間で予約した教室の正しいカウントを取得するために動作するはずすなわち

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

use構文を使用して

$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

それでも私は、特定の時間に教室を予約することができます既にデータベースに入っています – 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(); 
関連する問題