2017-01-02 7 views
1

Ich habe mit einer Funktion kämpfen, die true oder false zurückgibt, wenn die DateTime der Benutzer Anforderungen mit DateTime bereits in MYSQL-Datenbank überlappt.Retouren Verfügbarkeit für einen bestimmten Zeiten/Daten

Die Situation ist, dass Benutzer Autovermietungsanfragen über iOS-App einreichen können und es in DateTime-Format 2014-04-02 08:49:43 kommt. Ich benutze Laravel als API, um das Backend zu verwalten. Die Tabelle für Reservation ist:

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

So habe ich versucht, viele Methoden, aber Datum und Zeit der Reservierung ohne Überlappung ein Schmerz für die letzten 2 Tage gewesen. Das nächste, was ich zu tun habe, ist diese Funktion und ich denke (hoffentlich) diese Funktion ist richtig, aber etwas fehlt.

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; 
} 

Der Fehler, den ich aus dieser Funktion erhalten ist:

Anruf auf eine Elementfunktion zwischen() auf Zeichenfolge

ich wirklich jede Hilfe dankbar würde.

Antwort

3

Anstatt versuchen, zu verwenden, um zwischen() Sie

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

überprüfen könnte Dies sollte für alle Fälle false zurück, sofern Ihr neues Ereignis beide beginnt und endet vor dem Start des bestehenden Ereignis oder Sie neues Event beide starten und enden nach Ihrem bestehenden Ereignis.

Dies setzt voraus, dass Sie in allen Fällen das $from<$to und bereits überprüft haben, was hoffentlich der Fall ist!

+0

Das wird nicht funktionieren, es gibt einen Grund, warum die Zwischenprüfung da ist. Schreib einfach selbst auf, wenn und Termin nicht gebucht werden kann. Sie werden sehen, es gibt 3 Situationen: (1) Wenn der Termin vor allen anderen beginnt, endet aber zwischen eine bestehende (2) Wenn der Termin endet, nachdem alle anderen, sondern beginnt zwischen einem bestehenden (3) Wenn der Termin Starter vor allen anderen und endet nach allen anderen Es interferiert mit einem oder beiden Daten aus einem bestehenden Termin, sollten Sie Te-Slot blockieren. Dein Code kümmert sich nur um (1) und (2), denke ich. – leo0019

+0

Ich habe das ein paar Mal doppelt überprüft - ich denke immer noch, dass ich recht habe. –

+0

mein Datum und Uhrzeit in diesem Format '2017-01-02 08: 49: 43' und die Funktion in einigen Fällen nicht genau – leo0019

Verwandte Themen