返回给定时间/日期的可用性

时间:2017-01-02 22:53:07

标签: php mysql laravel datetime php-carbon

如果用户请求的DateTime与MYSQL数据库中已有的任何DateTime重叠,我一直在努力使用返回truefalse的函数。

情况是用户可以通过iOS应用程序提交汽车租赁请求,它采用DateTime格式2014-04-02 08:49:43。我正在使用Laravel作为管理后端的API。 Reservation的表格是:

Schema::table('reservations', function($table)
{
    $table->dateTime('from_date')->nullable();
    $table->dateTime('to_date')->nullable();
});

所以我尝试了很多方法但是保留日期和时间没有重叠是过去2天的痛苦。我最接近的是这个功能,我认为(希望)这个功能是正确的,但缺少一些东西。

 public function isSlotAvailable(Request $request) {
    $appointments = Reservation::all();
    $from = $request->from;
    $to = $request->to;

    foreach ($appointments as $appointment) {
        $eventStart = Carbon::instance(
            new DateTime($appointment['dt_start'])
        );

        $eventEnd = Carbon::instance(
            new DateTime($appointment['dt_end'])
        )->subSecond(1);

        if ($from->between($eventStart, $eventEnd) || 
            $to->between($eventStart, $eventEnd)   || 
            ($eventStart->between($from, $to) && $eventEnd->between($from, $to))) 
        {
            return false;
        }
    }

    return true;
}

我从这个函数得到的错误是:

  

在字符串

上调用()之间的成员函数

我真的很感激任何帮助。

1 个答案:

答案 0 :(得分:3)

而不是尝试在()之间使用,你可以检查

if($from<$eventEnd && $to>$eventStart){
    return false;
}

对于所有情况都应该返回false,除非您的新事件在现有事件开始之前开始和结束,或者您的新事件在现有事件之后开始和结束。

这假设您已经在所有情况下检查了$from<$to$eventStart<$eventEnd,我希望是这样的!