【问题标题】:avoid time/date overlapping in mysql (laravel)避免mysql中的时间/日期重叠(laravel)
【发布时间】:2017-05-15 21:36:48
【问题描述】:

我有一个 iOS 应用程序,用户可以每天或每小时预订一辆车,如果用户预订一辆车,其他用户在第一次预订结束之前无法预订。我使用 Laravel 作为 API 将数据保存到 MySQL 数据库。

时间和日期的格式是这样的27 Dec 201615:21。我正在保存数据

 public function requested(Request $request)
{
  $time = new Reservation();
  $time->from_date = $request->from_date;
  $time->to_date = $request->to_date;
  $time->from_time = $request->from_time;
  $time->to_time = $request->to_time;

}

但这肯定不会阻止时间重叠,所以我尝试了这个

 $carCount = Reservation::where(

  function ($query) use ($startTime, $endTime) {
            $query->where('from_time', '<', $endTime)
                ->where('to_time', '>', $startTime);
        }
    )->count();


    if ($carCount > 0) {
        return response()->json(['request' => 'no']); // this response just to check 
    } else {
        $carRoom->save();
        response()->json(['request' => 'yes']);
    }

然后我认为由于日期/时间格式,这不起作用。但我想确定我应该在 laravel 中转换日期的格式是什么?

这是我的预订迁移:

         $table->string('from_date')->nullable();
        $table->string('to_date')->nullable();

        $table->string('from_time')->nullable();
        $table->string('to_time')->nullable();

我制作了字符串,因为我不确定Time 或任何东西是否正确

我的主要问题是如何避免应用数据库中的时间和日期重叠?

【问题讨论】:

  • 如果是我,我会暂时忘记所有 PHP/Laravel 的东西,而是专注于获得有效的 MySQL 查询
  • 你的意思是这样的SELECT * FROM Reservation WHERE ((date_end &gt; '" . $from_date . "') AND (date_start &lt; '" . $to_date . "')) ";?或更复杂?抱歉,我是 Laravel 的新手
  • 嗯,我猜 :-)
  • 时间怎么样?是否可以在一个查询中同时检查时间和日期?
  • 该查询 sn-p 误解了重叠范围的概念 - 但将日期和时间存储为单个实体的想法是正确的

标签: php mysql laravel date laravel-5.3


【解决方案1】:

将数据库中的日期存储为时间戳 那么您的查询应该按预期工作然后转换传入的日期:

2016 年 12 月 27 日 15:21

使用 strtotime() 或 datetime 对象添加时间戳 两者都是 PHP 的一部分,请查看 PHP 文档以了解更多信息。

【讨论】:

  • 谢谢。现在我将日期存储为时间戳。如何在一个函数中进行两个查询以检查时间和日期是否与数据库中的其他时间和日期不重叠?
  • 哦,我看到你的时间和日期是分开的,我第一次阅读这个问题时没有看到
  • 我想我会亲自将日期时间组合存储为开始预订和结束预订(作为时间戳),然后将 SELECT COUNT(*) 作为 pre_booked FROM reservations WHERE 执行? > 预订开始和?
  • 我喜欢你的想法!您认为查询$query-&gt;where('from_time', '&lt;', $endTime) -&gt;where('to_time', '&gt;', $startTime); 会返回正确答案吗?
  • 否,因为它没有考虑日期,您可以将 SELECT COUNT(*) as pre_booked FROM reservations WHERE 执行? > from_date + TIME_TO_SEC(from_time) AND ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-04
  • 1970-01-01
相关资源
最近更新 更多