2015-11-10 77 views
5

我已經使用Laravel 5.1編寫了一個應用程序。該應用程序用於停車位。它通過在數據庫中創建3個不同的可用插槽(「上午」,「下午」,「全天」)來「規定」空間。Laravel 5.1輸入多個重複記錄到數據庫中

問題是,在快速頁面刷新時,空間被調配兩次,導致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並在遷移中執行SQL語句,這將根據您是否使用MySQL,MSSQL,Postgres等而有所不同。

在事務與唯一索引之間,數據庫將拒絕插入重複的行並將回滾壞的插入,所以你不會被卡在一個人擁有早上插槽和另一個擁有整天插槽的東西。

讓我知道你是否需要任何進一步的幫助!

相關問題