2017-10-01 1 views
1

Maintenant, dans mon contrôleur, il ressemble à ceciComment puis-je vérifier toutes les données en boucle avant d'enregistrer dans la base de données

assume that $available = [ 1,2,3,4 ] 

    for ($i=0; $i < 3; $i++) { 
     if($available < 3){ 
     echo 'success'; 
     $database->save(); 
     }else{ 
     echo 'error'; 
     } 
    } 

cette sortie frémira comme erreur de succès de succès de succès

et il permettra d'économiser 3 succès dans la base de données , comment puis-je vérifier si j'ai 1 erreur, il ne sauvegardera pas de données?

Maintenant, je suis en utilisant

$errors = false; 
    DB::transaction(function() use ($count,$request,$a,$errors) { 
     for ($i=0; $i < $count; $i++) { 
      $warehouse_products_sell = New Warehouse_products_sell; 
      $id_w = $request->input('idw'); 
      $id_c = $request->get('id_c')[$i]; 
      $id_p = $request->get('id_p')[$i]; 
      $qty = $request->input('quantity_box')[$i]; 
      $price = $request->input('price')[$i]; 
      $available = $this->check_stock($id_w, $id_p, $qty); 
      if($available > 0){ 
      $warehouse_products_sell->add_by = $request->input('add_by'); 

      $warehouse_products_sell->id_w = $id_w = $request->input('idw'); 
      $warehouse_products_sell->id_c = $request->get('id_c')[$i]; 
      $warehouse_products_sell->id_p = $id_p = $request->get('id_p')[$i]; 
      $warehouse_products_sell->quantity_box = $qty = $request->input('quantity_box')[$i]; 
      $warehouse_products_sell->price = $request->input('price')[$i]; 
      $warehouse_products_sell->serial_num = $a; 
      $available = $this->check_stock($id_w, $id_p, $qty); 
      $warehouse_products_sell->save(); 
      }else{ 

      echo "error"; 
      $errors = true; 

      throw new Exception('Error'); 
      } 
     } 
    }); 
    if ($errors) { 
     return redirect('URL'); 
    }else{ 
     return 'x'; 
    } 

Répondre

1

Vous pouvez utiliser les transactions. Jetez un oeil here.

Votre code va changer à ce

DB::transaction(function() use ($database, $available) { 
    for ($i=0; $i < 3; $i++) { 
     if($available < 3){ 
     echo 'success'; 
     $database->save(); 
     }else{ 
     echo 'error'; 
     throw new \Exception('Error'); 
     } 
    } 
}); 

Si une exception est levée, il rollback automatiquement.


Ajout redirigent si un problème arrise

$errors = false; 

DB::transaction(function() use ($database, $available, $errors) { 
    for ($i=0; $i < 3; $i++) { 
     if($available < 3){ 
     echo 'success'; 
     $database->save(); 
     }else{ 
     echo 'error'; 
     $errors = true; 
     throw new \Exception('Error'); 
     } 
    } 
}); 

if ($errors) { 
    return redirect('URL'); 
} 
+1

thnks Monsieur, je nv savoir avant =] – user8663822

+0

est leur toute façon de rediriger la route ou retourner la page après exception throw – user8663822

+0

pas, parce que quand vous faites cela, la 'fonction' (transaction) va attraper cette exception et la restauration. Ce que vous pouvez faire est de passer une variable sur le 'use' et s'il y a une erreur, changez-la en false ou quoi que ce soit qu'elle vous signale comme une erreur, et en dehors de la transaction, lisez cette variable puis redirigez. – matiaslauriti