【问题标题】:php - laravel : How to handle time overlapping in database?php - laravel:如何处理数据库中的时间重叠?
【发布时间】:2016-08-28 09:11:05
【问题描述】:

我想在我的数据库中保存两个时间间隔。它将在哪里检查数据库,如果有人已经预订了那个时间,它将不会节省时间,而如果它是空的,它将节省用户将作为输入提供的时间。

例如。用户想要预订 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'); 
            }

    }

【问题讨论】:

    标签: php mysql sql laravel laravel-5.2


    【解决方案1】:

    时间重叠的规则很简单(完整的图解说明见here):

    start1 < end2   AND   end1 > start2
    

    所以您的查询可以是:

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

    【讨论】:

      【解决方案2】:

      首先,为了能够在查询闭包中访问$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();
      

      希望这会有所帮助!

      【讨论】:

      • 我仍然可以在那个特定的时间预订教室
      • 不用说对不起兄弟,你只是在帮助你,你太棒了。但是我不明白为什么上面的代码也可以用相同的时间间隔预订教室。
      • 我以为您不希望能够预订当时已被预订一空的教室。上面的代码会检查当时教室是否已经被订满。如果有,它将返回大于 1 的计数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      相关资源
      最近更新 更多