【问题标题】:Laravel Eloquent Query to Check Overlapping Start and End DateTime FieldsLaravel Eloquent 查询检查重叠的开始和结束日期时间字段
【发布时间】:2018-12-09 22:08:41
【问题描述】:

我正在尝试创建一个用户选择开始日期和时间的预订系统。系统根据最长的产品服务时间创建结束日期和时间。目前这一切都想通了。

我的数据库中有一个用于我的事件的表,其中包含:

vendor_id | user_id | 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 的结束时间,那么它通过了我上面的检查,但这些时间显然重叠了几个小时.

我正在尝试找到一种解决方案来提取项目,即使它们重叠,而不仅仅是它们的开始和结束时间符合特定检查。

感谢任何帮助。

【问题讨论】:

    标签: php mysql laravel time eloquent


    【解决方案1】:

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

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

    翻译成比较是这样的

    • 1) B1 A1
    • 2) B1 > A1 和 B1
    • 3) B1 A1
    • 4) B1 > A1 和 B1

    1,3 和 2,4 一样

    在 laravel 中就足够了

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

    作为一个 sql 语句,这将是

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

    【讨论】:

    • 您可能可以使用whereBetween 和其他东西来优化查询,此外,我建议使用 Carbon 来处理日期,除了在 laravel 中转换为日期的表字段被实例化为 Carbon 对象的事实之外,Carbon有一些简洁的功能..
    • 那行得通。有时,您只需要另一种观点。哈哈。谢谢。
    • 很好,很高兴我能帮上忙。摆弄日期和期间总是很有趣:)
    • 或者只是检查一个严格地在另一个之前或之后。对?如果 B2 A2 那么,所有 B 都在 A 之后。它们不重叠。所以“不是(B2 A2)”应该重叠。遗憾的是,Laravel 中不存在 whereNot。
    猜你喜欢
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多