2017-01-04 7 views
0

私は車をレンタルできるアプリがあります。車はすでにデータベースに入っています。各オブジェクトをループして空き時間を返します(Laravel)

$table->string('name')->nullable(); 
$table->string('color')->nullable(); 
$table->string('model')->nullable(); 

それは、私はすでに、ユーザーが車や機能の意志ループを要求し、同じrequted車を見つける機能を作成し、私は予約テーブル

$table->increments('id'); 
$table->dateTime('from_date')->nullable(); 
$table->dateTime('to_date')->nullable(); 

を持ってレンタルなので。

car_userは予約された車とユーザーをリンクします。

  1. 同じ車(A)が再び予約することができません:私は、特に車を要求した(A).Iの日付と時間を節約しようとすると、

    $table->integer('user_id')->unsigned(); 
    $table->foreign('user_id')->references('id')->on('users'); 
    
    $table->integer('car_id')->unsigned(); 
    $table->foreign('car_id')->references('id')->on('cars'); 
    

    は今ことを確認する必要があります同じ時に。

  2. すべての車は同じ時間に利用可能です。車(A)は予約されています。

だから私は、最初の可用性が予約テーブルに存在する場合、この関数は、チェックします

public function isSlotAvailable(Request $request) { 
    $appointments = Reservation::all(); 
    $from = Carbon::parse($request->from); 
    $to = Carbon::parse($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台の車として扱うので間違っている。たとえば、データベースに5台の車があり、ユーザーが2017-01-05 05:00:002017-01-10 09:00:00の車を予約しているとします。すべての車はループが$car->allreservationのように各車を通過しないので、同じ時間に予約されます。新しい要求された日付が重なっている場合

質問

は、どのようにそれぞれの車の中で私のループとは確認できますか?それが重なると、それは第2の車に行きチェックし、そうでなければそれをユーザにリンクする。

は本当にあなたの助けに感謝

UPDATE

これは私が

$id = $new_car->id; 
$Reservation_id = $time->id; 
$user->cars()->attach($id, ['type' => 'requested']); 
$user->reservations()->attach(Reservation_id); 

答えて

1

あなたはTIMESTAMPのCURRENT_TIME_STAMPを使用していないデータベーステーブルにdatetimeデータ型を使用していることを確認し、新たな要求された車を保存する方法です。

現在のタイムスタンプを使用している場合は、DATETIMEに変更して、フォームの日付フィールド値をループに保存します。私はそれが動作することを願って!

+0

を参照してください。もっと説明できますか? – leo0019

1

あなたが必要とするのは、より良いデータベース設計です。

それはあなたが別の数量と同じ車を持っているようだと(つまり?そうでない場合は、この車のIDが実際の車のIDのようなものであるコメントかでください?=>それはユニークである)

何が必要そうであればされますデータベースを扱う適切な方法。この場合、1対多の関係(複数のインスタンスを持つ同じidカー)を実装する必要があります。 この場合、別のフィールドを車に追加する必要があります。車の数量のようなもの。その後、総量に対して予約された車を確認することができます。その後、予約された車の数があなたが持っている車の数より少ない場合、それは予約することができます。

(別のIDを持つ各車 - 同じIDの車の繰り返し数はありません)。 次に、スロットが利用可能かどうかを確認するときは、その車両のすべての予約を取得し、同じ予約をしているかどうかを確認します。 これはあなたが探しているものではない場合は、ご意見ください。

編集

あなたは、データベースの正規化についてのいくつかを検討する必要があるかもしれません。チュートリアルhere at tutorials-point

  1. まず、車のIDを予約テーブルに追加します。
  2. 予約テーブルにユーザーIDを追加します。
  3. 次に、その車の予約を下記のようにすることができます。
  4. 予約されている予約が予約されているかどうかを確認してください。

laravelでは、laravelデータベースクエリの詳細を読むには

$reservations= DB::table('reservations')->where('car_id', '=', 100)->get() // if car_id = 100 

のような選択クエリを書くことができ、私は予約でDATETIMEように、1つのエンティティの日付と時間を記憶していますDocumentation

+0

私のデータベースには、さまざまな車種があります。 車のIDは車に関連付けられたmysql IDであり、一意です。 私が直面している状況は2番であり、私の問題はちょうど「ちょうどその車のすべての予約を得て、それが同じ(または間に)予約をしているかどうかを確認する」というものです。私の車モデルでは、私は 'return $ this-> hasMany( 'User'、 'car_user');' – leo0019

+0

を持っているのですが、なぜあなたは単に(car_id = "あなたのcarid" – HelpingHand

+0

laravelの質問を回答 – HelpingHand

関連する問題