2017-06-28 2 views
1

Donc je suis ici pour vous poser une question de logique.Laravel 5 - enregistrer des modèles en db séquentiellement

J'ai donc modèle de voiture avec ces propriétés: id, nom, description.

Puis-je avoir un deuxième modèle nommé CarOptional qui est en fait un modèle de relation avec le troisième modèle en option et il a ces propriétés: id_optional, id_car.

, j'ai un troisième modèle qui est CarColours (que nous faisons semblant est une table similaire à carOptional) avec id_colour, id_car propriétés. Maintenant je vais enregistrer une nouvelle voiture, donc je vais aller avec la méthode $car = Car :: create (arraydatas). Enregistré mes données sur DB J'ai mon modèle de voiture afin que je puisse avoir son id et sauver CarOptional es.

ForEach ($ optionals as $ optional) { 
   CarOptional :: create (array ("id_car" => $ car-> id, "id_optional" => $ optional-> id)) 
} 

Alors, je fais de même avec les CarColours modèle, de sorte que le cycle de la méthode de création, mais ce que je demande est:

Comment gérer l'erreur de création (par exemple) de CarOptional , puis arrêtez tous les suivants créés et que je veux "supprimer" sur la base de données précédemment enregistré et renvoyer une erreur?

Répondre

1

Ce que vous demandez est appelé: Transactions

<?php 
namespace ProjectName\Whatever\Mappers; 

final class CarMapper { 

    public function createCar($car, $optionals, $colors) { 
     DB::transaction(function() use($car, $optionals, $colors) { 
      $this->createOptionals($car, $optionals); 
      $this->createColors($car, $colors); 
     }); 
    } 

    private function createOptionals($car,$optionals) { 
      foreach($optionals as $optional) { 
       CarOptional::create([ 
        'id_car' => $car->id, 
        'id_optional' => $optional->id 
       ]); 
      } 
    } 

    private function createColors($car,$optionals) { 
     foreach($colors as $color) { 
      CarColour::create([ 
       'id_car' => $car->id, 
       'id_colors' => $color->id 
      ]); 
     } 

    } 
} 

En mots simples: avec une opération SQL, si quelque chose se passe mal au milieu de rien de transaction sera engagé. Vous n'aurez pas besoin de vous soucier de "", puis d'arrêter toutes les créations ultérieures et que je souhaite "supprimer" sur la base de données précédente ".

C'est la partie où vous devriez vous concentrer:

DB::transaction(function() { 
    // ... 
}); 
+0

Merci !!! :) – LorenzoBerti