2015-11-10 36 views
5

Tôi đã viết một ứng dụng bằng cách sử dụng Laravel 5.1. Ứng dụng này dành cho chỗ đậu xe. Nó "quy định" các khoảng trống bằng cách tạo ra 3 khe có sẵn khác nhau trong cơ sở dữ liệu (Buổi sáng, Buổi chiều, Cả ngày).Laravel 5.1 nhập nhiều bản ghi trùng lặp vào cơ sở dữ liệu

Sự cố là khi làm mới trang nhanh, các khoảng trống được cấp phép hai lần, dẫn đến 6 vị trí được nhập vào cơ sở dữ liệu.

Tuy nhiên, nếu tôi làm mới trang sau khoảng thời gian trễ là 5 giây, không có thêm bản ghi nào được nhập vào. Câu lệnh if của tôi bên dưới dường như hoạt động, không phải khi trang/kết nối được làm mới nhanh chóng.

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()')]); 
    } 
} 

Có ai biết tại sao điều này có thể xảy ra không?

+1

Bạn cũng có thể thêm bộ lọc trước khi yêu cầu để kiểm tra các xung đột cơ sở dữ liệu có thể xảy ra – IlGala

+0

Nhưng tôi không hiểu tại sao chúng lại được nhập nhiều lần? Có lời giải thích nào đó không? Tôi chưa bao giờ nghĩ điều này là có thể. – V4n1ll4

+0

Vui lòng đăng tuyến đường của bạn và cách chúng được xử lý (các hành động đóng và/hoặc điều khiển). Nếu bạn đã đăng lên một tuyến đường khác mà bạn đã đăng nhập, điều này sẽ không xảy ra. – Bogdan

Trả lời

1

Khi xử lý loại sự cố này, database transactions thường trở thành một phần của giải pháp. Mã sẽ giống như thế này:

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()')]); 
     } 
    } 
}); 

Để thực sự đảm bảo toàn vẹn dữ liệu, bạn cũng sẽ muốn define a unique index trên các cột parking_bay, ngày tháng và khe. Bạn có thể cần phải bước ra ngoài API di chuyển và chỉ thực thi câu lệnh SQL trong quá trình di chuyển của bạn, điều này sẽ thay đổi dựa trên việc bạn đang sử dụng MySQL, MSSQL, Postgres, v.v. từ chối để chèn hàng trùng lặp và sẽ rollback chèn xấu, vì vậy bạn sẽ không bị mắc kẹt với một cái gì đó giống như một người có khe buổi sáng và một có khe cắm cả ngày.

Hãy cho tôi biết nếu bạn cần thêm trợ giúp nào!

Các vấn đề liên quan