首页 文章

Laravel Eloquent查询检查重叠的开始和结束日期时间字段

提问于
浏览
0

我正在尝试创建一个预订系统,用户可以选择开始日期和时间 . 系统根据最长的产品服务时间创建结束日期和时间 . 目前这一切都已经弄明白了 .

我的数据库中有一个表用于我的事件:

vendor_id | user_id | start | end

start和end列的类型为DateTime .

在我的控制器中,我试图找出特定的日期和时间是否可用,但由于某种原因,我无法让它向我展示时间重叠的项目 .

这是我的控制器代码:

$items = $query->where('vendor_id', $user->vendor->id)
                ->where('start', '<=', date('Y-m-d H:i:s', strtotime($start)))
                ->whereDate('end', '>=', date('Y-m-d H:i:s', strtotime($end)))
                ->get();

所以一些示例场景......

我在系统中有一个事件,其开始时间为 2019-01-01 13:00:00 ,结束时间为 2019-01-01 17:00:00 .

如果我选择2019-01-01 12:00:00的开始时间和2019-01-01 16:00:00的结束时间,那么它会通过我上面的检查,但这些时间明显重叠几个小时 .

我试图找到一个解决方案来拉动项目,即使它们重叠,如果他们的开始和结束时间满足某个检查,则不是 .

任何帮助表示赞赏 .

1 回答

  • 1

    不完全理解你的问题,但无论如何都会尝试回答 . 对于日期重叠,我看到四种情况会发生重叠 . 将A视为事件时间 Span ,将B视为搜索参数时间 Span

    1)
       A1          A2
    B1       B2
    
    
    2)
       A1          A2
             B1       B2
    
    
    3)
       A1          A2
    B1                B2
    
    
    4)
       A1          A2
           B1  B2
    

    转换为比较它将是

    • 1)B1 <A1 AND B2> A1

    • 2)B1> A1和B1 <A2

    • 3)B1 <A1 AND B2> A1

    • 4)B1> A1和B1 <A2

    1,3与2,4相同

    在laravel这应该足够了

    $query->where(function ($query) {
        $query->where(function ($query) {
            $query->where([
                [$B1, '<', $A1],
                [$B2, '>', $A1],
            ]);
        })->orWhere(function ($query) {
            $query->where([
                [$B1, '>', $A1],
                [$B1, '<', $A2],
            ]);
        });
    });
    

    作为一个sql语句,这将是

    where ((($B1 < $A1 and $B2 > $A1)) or (($B1 > $A1 and $B1 < $A2)))
    

相关问题