2015-11-10 14 views
5

Ho scritto un'applicazione utilizzando Laravel 5.1. L'applicazione è per spazi di parcheggio. "Provvede" agli spazi creando 3 diversi slot disponibili nel database (Mattina, Pomeriggio, Tutto il giorno).Laravel 5.1 Inserimento di più record duplicati nel database

Il problema è che in un aggiornamento rapido della pagina, gli spazi vengono sottoposti a provisioning due volte, con il conseguente inserimento di 6 slot nel database.

Tuttavia, se si aggiorna la pagina dopo un ritardo di 5 secondi, non vengono immessi ulteriori record. La mia istruzione if qui sotto sembra funzionare, non solo quando la pagina/connessione viene aggiornata rapidamente.

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

Qualcuno sa perché questo potrebbe accadere?

+1

È sempre possibile aggiungere un filtro prima della richiesta per verificare possibili conflitti di database – IlGala

+0

Ma non capisco perché vengono immessi più volte? C'è una spiegazione da qualche parte? Non ho mai pensato che fosse possibile. – V4n1ll4

+0

Si prega di inviare i percorsi e come vengono gestiti (chiusure e/o azioni del controllore). Se stai postando su un percorso diverso da quello in cui è stata inserita la prenotazione, questo non dovrebbe accadere. – Bogdan

risposta

1

Quando si ha a che fare con questo tipo di problema, database transactions spesso risulta essere parte della soluzione. Il codice sarà simile a questo:

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

Per garantire davvero l'integrità dei dati, si potrà anche define a unique index attraverso le colonne parking_bay, la data e slot. Potrebbe essere necessario uscire dall'API di migrazione ed eseguire semplicemente un'istruzione SQL nella migrazione, che varierà a seconda che si utilizzi MySQL, MSSQL, Postgres, ecc.

Tra le transazioni e un indice univoco, il database rifiuta di inserire righe duplicate e ripristinerà l'inserimento non valido, in modo da non rimanere bloccato con qualcosa come una persona che ha lo slot mattutino e un'altra che ha lo slot tutto il giorno.

Fammi sapere se hai bisogno di ulteriore aiuto!

Problemi correlati