2017-01-02 2 views
1

Я борется с функцией, которая возвращает true или false, если DateTime пользователь запрашивает совпадения с любым из DateTime уже в базе данных MYSQL.Возвращает доступность для заданного времени/дат

Ситуация заключается в том, что пользователи могут отправлять запросы на аренду автомобилей через приложение 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; 
} 

ошибка, я получаю от этой функции:

вызов функции члена между() на строке

Я бы очень признателен за любую помощь.

ответ

3

Вместо того, чтобы использовать между() можно проверить

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

Это должно возвращать ложь для всех случаев, кроме случаев, когда ваше новое событие как начинается и заканчивается перед началом существующего события, или новое событие как начинается, так и заканчивается после вашего существующего события.

Предполагается, что вы уже проверили, что $from<$to и $eventStart<$eventEnd во всех случаях, что, я надеюсь, это так!

+0

Это не работает, есть причина, по которой между проверкой есть. Просто напишите сами, когда и назначение не может быть забронировано. Вы увидите, что есть 3 ситуации: (1) Если назначение начинается раньше всех остальных, но заканчивается между существующим (2) Если назначение заканчивается после всех остальных, но начинается между существующим (3) Если назначение стартеры перед всеми остальными и заканчиваются за всех остальных. Это одно из двух или двух дат от существующей встречи, вы должны заблокировать слот te. Ваш код заботится только о (1) и (2), я думаю. – leo0019

+0

Я дважды проверял это несколько раз - я все еще думаю, что я прав. –

+0

мои даты и время в этом формате '2017-01-02 08: 49: 43', а функция в некоторых случаях неверна – leo0019