2017-01-02 5 views
1

ユーザが要求したDateTimeが既にMYSQLデータベースにあるDateTimeと重複している場合、trueまたはfalseを返す関数で苦労しています。指定された時間/日付の空き状況を返します

状況は、ユーザーがiOSアプリを経由してレンタカー要求を提出することができるということです、それはDateTime書式2014-04-02 08:49:43でいます。私はバックエンドを管理するAPIとしてLaravelを使用しています。 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; 
} 

をチェックすることができますこれは、既存のイベントの開始前に場所をあなたの新しいイベントの両方の開始と終了を除く、すべての場合にfalseを返す、または新しいイベントでなければなりません既存のイベントの後に開始と終了の両方があります。

これは、すべての場合に$from<$to$eventStart<$eventEndが既にチェックされていることを前提としています。

動作しません
+0

は、チェックの間に存在している理由があります。いつでも予約を取ることはできません。 (1)予定が他のものの前に始まっているが、既存の の間で終了する場合(2)予定が終了した後に終了し、既存の の間に開始する場合(3)予定他のすべての前にスターターとは それはそれは既存の予定からいずれか一方または両方の日付とinteferes他のすべては、あなたがTEスロットをブロックする必要があります後に終了します。あなたのコードは(1)と(2)の世話をするだけです。 – leo0019

+0

私はこれを何度かダブルチェックしました - 私はまだ私が正しいと思います。 –

+0

この形式での私の日付と時刻 '2017年1月2日08:49:いくつかのケースで43'と機能が正確でない – leo0019

関連する問題