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

Dan*_*ite 1 php mysql time laravel eloquent

我正在尝试创建一个预订系统,用户可以在其中选择开始日期和时间。系统根据最长的产品服务时间创建结束日期和时间。目前所有这些都已经弄清楚了。

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

vendor_id | user_id | start | end
Run Code Online (Sandbox Code Playgroud)

开始和结束列的类型为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();
Run Code Online (Sandbox Code Playgroud)

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

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

如果我选择开始时间为2019-01-01 12:00:00和结束时间为2019-01-01 16:00:00,则它会通过我上面的检查,但是这些时间显然重叠了几个小时。

我正在尝试找到一种解决方案,即使它们重叠,也不能拉动它们,而不是仅在它们的开始时间和结束时间满足一定要求的情况下才能拉出。

任何帮助表示赞赏。

Jan*_*son 5

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

1)
   A1          A2
B1       B2


2)
   A1          A2
         B1       B2


3)
   A1          A2
B1                B2


4)
   A1          A2
       B1  B2
Run Code Online (Sandbox Code Playgroud)

翻译成比较它是

  • 1)B1 <A1和B2> A1
  • 2)B1> A1和B1 <A2
  • 3)B1 <A1和B2> A1
  • 4)B1> A1和B1 <A2

1,3和2,4一样

在laravel中,这足够了

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

作为一个SQL语句,这将是

where (($B1 < $A1 and $B2 > $A1) or ($B1 > $A1 and $B1 < $A2))
Run Code Online (Sandbox Code Playgroud)