2015-11-10 18 views
5

Laravel 5.1を使用してアプリケーションを作成しました。このアプリケーションは駐車スペースのためのものです。データベースに3つの利用可能なスロット(午前、午後、終日)を作成することによって、スペースを「プロビジョニング」します。Laravel 5.1が複数の重複レコードをデータベースに入力する

問題は、ページの高速リフレッシュでスペースが2回プロビジョニングされるため、6スロットがデータベースに入力されることです。

ただし、5秒後にページを更新すると、それ以上のレコードは入力されません。以下のif文は動作しているようですが、ページ/接続がすばやく更新されたときではありません。

foreach($bays as $bay) { 
    if(!BookingDates::where('date', $date)->where('parking_bay', $bay->number)->count()) { 
     BookingDates::insert(['parking_bay' => $bay->number, 'date' => $date, 'slot' => 'Morning', 'time' => '7am - 1pm', 'status' => 'Available', 'created_at' => DB::raw('now()')]); 
     BookingDates::insert(['parking_bay' => $bay->number, 'date' => $date, 'slot' => 'Afternoon', 'time' => '1pm - 7pm', 'status' => 'Available', 'created_at' => DB::raw('now()')]); 
     BookingDates::insert(['parking_bay' => $bay->number, 'date' => $date, 'slot' => 'All Day', 'time' => null, 'status' => 'Available', 'created_at' => DB::raw('now()')]); 
    } 
} 

なぜこのようなことが起こるのでしょうか?

+1

可能性のあるデータベースの競合を確認するために、リクエスト前にフィルタを追加することはできます – IlGala

+0

しかし、なぜ何度も入力されているのか分かりません。どこかに説明はありますか?私はこれが可能だとは決して考えなかった。 – V4n1ll4

+0

あなたのルートとその取り扱い方法を記入してください(クロージャおよび/またはコントローラのアクション)。予約が入力されている別のルートに投稿している場合は、このようなことは起こりません。 – Bogdan

答えて

1

この種の問題に対処するときは、database transactionsが解決策の一部となることがよくあります。コードは次のようになります:

DB::transaction(function() use ($bays, $date){ 
    foreach($bays as $bay) { 
     if(!BookingDates::where('date', $date)->where('parking_bay', $bay->number)->count()) { 
      BookingDates::insert(['parking_bay' => $bay->number, 'date' => $date, 'slot' => 'Morning', 'time' => '7am - 1pm', 'status' => 'Available', 'created_at' => DB::raw('now()')]); 
      BookingDates::insert(['parking_bay' => $bay->number, 'date' => $date, 'slot' => 'Afternoon', 'time' => '1pm - 7pm', 'status' => 'Available', 'created_at' => DB::raw('now()')]); 
      BookingDates::insert(['parking_bay' => $bay->number, 'date' => $date, 'slot' => 'All Day', 'time' => null, 'status' => 'Available', 'created_at' => DB::raw('now()')]); 
     } 
    } 
}); 

が実際にデータの整合性を確保するために、あなたはまた、列parking_bay、日付、およびスロット間define a unique indexしたいと思うでしょう。移行APIの外に出て、移行でMySQL、MSSQL、Postgresなどを使用しているかどうかによって異なるSQLステートメントを実行する必要があります。

トランザクションと一意のインデックスの間で、データベースは重複した行を挿入することを拒否し、不正な挿入をロールバックします。したがって、1人の人が午前のスロットを持ち、もう1人が終日のスロットを持つようなことに悩まされません。

さらなるヘルプが必要な場合はお知らせください。

関連する問題