Laravel:如何避免时间重叠?

Posted

技术标签:

【中文标题】Laravel:如何避免时间重叠?【英文标题】:Laravel : how to avoid time overlapping? 【发布时间】:2016-05-12 17:09:25 【问题描述】:

我正在构建一个 laravel 控制器,试图避免时间重叠。但是我的查询遇到了问题,因为我无法在控制器中正确运行查询:

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=Carbon::parse(str_replace(array('am', 'pm'), ':00', $request->input('start')));
            $classRoom->end=Carbon::parse(str_replace(array('am', 'pm'), ':00', $request->input('end')));
            $day = $classRoom->day_id;
            $startTime=$classRoom->start;
            $endTime=$classRoom->end;

        $result=DB::select( DB::raw("SELECT * FROM `allocate_rooms`
         WHERE  start='$startTime' AND end='$endTime' AND  day_id='day'"));
                  if (sizeof($result)>0) 
                 flash()->error('Class Room Already Taken.');
             return redirect('allocateRoomPage');
                    
            else  
                 $classRoom->save();  
                   flash()->success('Successfully allocated room.');          
                 return redirect('allocateRoomPage');  
                              
    

首先在我的控制器的查询中,我将检查作为输入给出的 day_id 是否与具有该 day_id 的数据库匹配,然后它会检查时间,如果匹配,结果将超过一个,所以它可以' t 让用户保存输入,否则如果查询失败,它将让用户保存数据。

我遇到了查询问题。如果有人帮助找出解决方案。

【问题讨论】:

那么查询有什么问题呢?你能发布确切的错误信息吗? 【参考方案1】:

首先,我建议您在创建模型实例之前对您的输入执行一些validations。 然后,我不明白为什么你有时使用$request->Input(['input_name']),有时使用$request->input('input_name'),最好使用第二种语法。

我编辑了你的代码,请测试一下,它应该可以工作。

public function postAllocateRoom(Request $request)
    
            // SOME VALIDATION HERE BEFORE GO ON, PLEASE

            $startTime = Carbon::parse(str_replace(array('am', 'pm'), ':00', $request->input('start')));
            $endTime = Carbon::parse(str_replace(array('am', 'pm'), ':00', $request->input('end')));
            $dayId = $request->input('day_id');

            $timeExists = AllocateRooms::where('day_id', $dayId)
                                                ->where('start', $startTime)
                                                ->where('end', $endTime)
                                                ->exists(); //use allocate_rooms table model (I don't know if it is ClassRomm)

            if($timeExists)
                reuturn redirect('allocateRoomPage')->withErrors(['time' => 'Class Room Already Taken']);
            

            $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=$dayId;
            $classRoom->start=$startTime;
            $classRoom->end=$endTime;
            $classRoom->save();

            $request->session()->flash('success', 'Successfully allocated room');

            return redirect('allocateRoomPage'); 


    

【讨论】:

以上是关于Laravel:如何避免时间重叠?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 使用 QueryBuilder 时如何避免页面重新加载

如何使用 Laravel 的块来避免内存不足?

Vue 组件 - 如何避免改变一个 prop(Laravel 组件)

如何避免 laravel(php) 中的嵌套查询?

如何避免 Laravel 中服务器发送事件的单一路由

如何避免 laravel 中的嵌套形式?