【问题标题】:Laravel 5.1 Fetch Rows between start_time and end_time (two different fields)Laravel 5.1 在 start_time 和 end_time 之间获取行(两个不同的字段)
【发布时间】:2017-07-18 04:15:20
【问题描述】:

我一直在做预订项目,我收集请求(time_start 和 time_end)并为每个请求添加 1:30 小时,这样我可以防止用户选择冲突。

我已经尝试使用“Between”,但它似乎不起作用。

->whereBetween('reservation_time_start', [$time_from, $time_to])
->whereBetween('reservation_time_end', [$time_from, $time_to])

我也试过了,

->whereRaw('((reservation_time_end <= ? AND reservation_time_end >= ?) OR (reservation_time_start >= ? AND reservation_time_start <= ?))',[$time_end, $time_start,$time_start, $time_end])

它有效,但在某些情况下,例如在某个时间范围内,我没有得到任何结果。像这样。

+----+------------------------+----------------------+
| id | reservation_time_start | reservation_time_end |
+----+------------------------+----------------------+
|  1 | 10:00:00               | 13:00:00             | <- i need to get this
|  2 | 12:00:00               | 14:00:00             |
|  3 | 14:00:00               | 15:00:00             |
+----+------------------------+----------------------+

用户输入示例:

$reservation_time_start = 12:00:00 (-1:30 Hour)
$reservation_time_end = 14:00:00 (+ 1:30 hour)

当我执行我的代码时,它返回 null。请帮忙。

【问题讨论】:

  • 即转换,我的问题是如何在两个不同字段的两个时间范围内从用户输入的数据库中获取数据。
  • 你能检查一下数据库中这些列的数据类型,应该是时候了。 AND ->whereBetween('reservation_time_start', [$time_from, $time_to]) ->whereBetween('reservation_time_end', [$time_from, $time_to]) 将被解释为 AND 你需要的是 orWhereBetween
  • 是的,它是“时间”数据类型。
  • 试试这个 ->where(function($query) use ($data){ $query->whereBetween('date',array($data['datefrom'],$data['dateto '])) ->orwhereBetween('time',array($data['datefrom'],$data['dateto'])); })
  • 您应该同时使用日期和时间,因为今天和明天的时间可能会有问题

标签: php mysql laravel eloquent laravel-5.1


【解决方案1】:

您可以使用 Carbon 来解决您的问题,

您的用户输入时间为:

$reservation_time_start = 12:00:00;
$reservation_time_end = 14:00:00;

我建议你使用日期和时间,所以你的用户输入应该是,

$reservation_time_start = 2017-07-18 12:00:00;
$reservation_time_end = 2017-07-18 14:00:00;

现在,用 Carbon 解析这些时间。之后分别从结束时间和开始时间加减 1:30 小时。

$start_time = Carbon::parse($reservation_time_start)->subMinutes(90);
$end_time = Carbon::parse($reservation_time_end)->addMinutes(90);

之后,你可以像这样使用简单的查询,

DB::table('reservation')->where(function($query)  
     use($start_time,$end_time){      

         $query->where('reservation_time_start','>',$start_time)
               ->where('reservation_time_start','<',$end_time);
     })
    ->orWhere(function($query) use($start_time,$end_time){   

         $query->where('reservation_time_end','>',$start_time)
               ->where('reservation_time_end','<',$end_time);
    })
    ->get();

从上述查询中,您将获得给定时间范围内的预订。

希望你能理解。

更新

在您的情况下,您必须在预订时考虑以下情况。

  1. 在给定时间范围内开始预订。
  2. 预订在给定的时间范围内结束。
  3. 在给定时间范围内开始和结束预订。

【讨论】:

  • 我已经在我的时间范围内进行了碳解析,并且还尝试了您的示例代码,但仍然没有得到 reservation_id = 1 的结果(上表)。我选择的时间是 10:00:00 到 13:00:00。
  • @jp.palubs 你到底想要什么?在开始时间和结束时间期间开始和完成的所有预订,或在此期间发生的所有预订?
  • 在该时间段内保留,因此用户/客户端将阻止点击这些时间。
  • 它现在可以工作了,谢谢你。我刚刚发现我在 $start_time 中添加了 90 分钟的时间,而不是减去它。
  • @jp.palubs 恭喜你,很高兴它帮助了你
猜你喜欢
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 2022-06-29
  • 1970-01-01
相关资源
最近更新 更多