Laravel 避免日期重叠

Laravel 避免日期重叠,laravel,laravel-5,Laravel,Laravel 5,我是拉拉维尔的新手,正在尝试实现任何一天都不能重叠的预订日期 我有一个叫“预订”的模型,包括房间id、开始日期和结束日期 我进行了验证,检查结束日期不能早于开始日期: $this->validate($request, [ 'start_date' => 'required|date', 'end_date' => 'required|date|after_or_equal:start_date', ]); 但是,我不知道如何检查日期范围是否与

我是拉拉维尔的新手,正在尝试实现任何一天都不能重叠的预订日期

我有一个叫“预订”的模型,包括房间id、开始日期和结束日期

我进行了验证,检查结束日期不能早于开始日期:

$this->validate($request, [
        'start_date' => 'required|date',
        'end_date' => 'required|date|after_or_equal:start_date',
]);
但是,我不知道如何检查日期范围是否与预订表中存储的同一房间id的任何其他日期范围不冲突(因为同一范围内的一个房间不能预订两次)

任何帮助都将不胜感激


谢谢

内置碳法isPast(),因此您可以使用:

$start_date->isPast()
$end_date->isPast()
您可以检查所选的两个项目是否都是在过去预订的

如果您没有使用碳,请点击以下链接:

您必须在数据库中检查。所以你可以这样做:

$result = Bookings::where('start_date', '<=' $request->start_date)->where('end_date', '>=' $request->end_date)->where('room_id',$request->room_id)->first();
if(!$result){
  // Code to Book room
}
$result=Bookings::where('start_date','='$request->end_date)->where('room_id',$request->room_id)->first();
如果(!$result){
//预订房间的代码
}

在一个典型的重叠中,给定两个事件A和B,你必须考虑四个场景:

  • 事件A包含事件B
  • 事件B包含事件A
  • 事件A的结束日期与事件B的开始日期重叠
  • 事件B的结束日期与事件A的开始日期重叠
  • 因此,在sql中,要检查某个房间在某个日期间隔内是否繁忙,假设2018-11-20'和2018-11-30'是:

    select * 
    from rooms 
    where 
        start_date between '2018-11-20' and '2018-11-30' or 
        end_date between '2018-11-20' and '2018-11-30' or 
        '2018-11-20' between start_date and end_date or 
        '2018-11-30' between start_date and end_date;
    
    在laravel中,我要做的是在模型中创建一个范围

    public function scopeByBusy($query,$start_date,$end_date) 
    { 
        return $query->whereBetween('start_date', [$start_date, $end_date]) 
            ->orWhereBetween('end_date', [$start_date, $end_date]) 
            ->orWhereRaw('? BETWEEN start_date and end_date', [$start_date]) 
            ->orWhereRaw('? BETWEEN start_date and end_date', [$end_date]); 
    }
    
    最后,我可以验证id为95的房间在“2018-11-20”和“2018-11-30”之间是否繁忙,如下所示:

    $room_id = 95;
    $start = '2018-11-20';
    $end = '2018-11-30';
    $exists = Rooms::where('id', $room_id)
        ->byBusy($start, $end)
        ->first();
    
    if($exists)
    {
        echo "the room is busy in the interval you selected";
    }
    

    我希望它能对你们有所帮助。

    我有一个类似的用法,我需要检查这个人是否已经安排了日期范围内的事情

    下面是一个示例laravel代码:

     $start = Carbon::parse($request['start_date'])->format('Y-m-d 00:00:00');
     $end = Carbon::parse($request['end_date'])->format('Y-m-d 23:59:59');
     $existsActive = Microsite::where(function ($query) use ($start) {
                                          $query->where('start_date', '<=', $start);
                                          $query->where('end_date', '>=', $start);
                                      })->orWhere(function ($query) use ($end) {
                                          $query->where('start_date', '<=', $end);
                                          $query->where('end_date', '>=', $end);
                                      })->count();
     if($existsActive > 0 ){
        echo "Already exists";  
     }
    
    
    $start=Carbon::parse($request['start_date'])->格式('Y-m-d 00:00:00');
    $end=Carbon::parse($request['end_date'])->格式('Y-m-d23:59:59');
    $existsActive=Microsite::where(函数($query)use($start){
    $query->where('start_date','=',$start);
    })->orWhere(函数($query)使用($end){
    $query->where('start_date','=',$end);
    })->计数();
    如果($existsActive>0){
    回声“已经存在”;
    }
    
    第一个答案很好。我快速浏览了你的帖子,并将格式更改为堆栈溢出上常用的格式。我还修复了第二个代码块中的SQL注入漏洞。您可能希望使用查询生成器功能为您绑定参数,否则查询将不安全。但无论如何,答案很好!谢谢@Namoshek,我已经和Laravel和其他东西玩了一段时间了,但我从未给出过答案,我想是时候和其他人分享我学到的了:)。谢谢你纠正我。这是一个很好的观点。安全我没有考虑这一点,因为日期必须通过一个验证规则请求(规则)(“必需的”、“DATEOFFLATE:D/M/Y”),甚至使用自定义规则对象来验证第二个日期大于或等于第一个日期。然后,当日期到达控制器时,我将其格式化为数据库格式“Y-m-d”,然后使用模型的范围。我有点晚了,但是否需要
    或whereraw
    s?我认为有两个条件就足够了。后面的是不必要的检查。我只是想检查数据库中是否存在任何重叠条目。这对我有用。