135 votes

Laravel Eloquent ORM Transactions

L'ORM Eloquent est très bien, mais je me demande s'il existe un moyen facile de configurer les transactions MySQL en utilisant innoDB de la même manière que PDO, ou si je dois étendre l'ORM pour rendre cela possible ?

221voto

The Shift Exchange Points 23103

Vous pouvez le faire :

DB::transaction(function() {
      //
});

Tout ce qui se trouve à l'intérieur du Closure s'exécute dans une transaction. Si une exception se produit, le retour en arrière est automatique.

122voto

Si vous n'aimez pas les fonctions anonymes :

try {
    DB::connection()->pdo->beginTransaction();
    // database queries here
    DB::connection()->pdo->commit();
} catch (\PDOException $e) {
    // Woopsy
    DB::connection()->pdo->rollBack();
}

Mise à jour : Pour laravel 4, le pdo n'est plus public, donc :

try {
    DB::beginTransaction();
    // database queries here
    DB::commit();
} catch (\PDOException $e) {
    // Woopsy
    DB::rollBack();
}

51voto

Chris Points 3371

Si vous voulez éviter les fermetures, et que vous êtes heureux d'utiliser des façades, ce qui suit permet de garder les choses propres et agréables :

try {
    \DB::beginTransaction();

    $user = \Auth::user();
    $user->fill($request->all());
    $user->push();

    \DB::commit();

} catch (Throwable $e) {
    \DB::rollback();
}

Si l'une des déclarations échoue, le commit n'aura jamais lieu et la transaction ne sera pas traitée.

43voto

Si vous voulez utiliser Eloquent, vous pouvez aussi utiliser ceci

Voici un exemple de code tiré de mon projet

        /* 
         * Saving Question
         */
        $question = new Question;
        $questionCategory = new QuestionCategory;

        /*
         * Insert new record for question
         */
        $question->title = $title;
        $question->user_id = Auth::user()->user_id;
        $question->description = $description;
        $question->time_post = date('Y-m-d H:i:s');

        if(Input::has('expiredtime'))
            $question->expired_time = Input::get('expiredtime');

        $questionCategory->category_id = $category;
        $questionCategory->time_added = date('Y-m-d H:i:s');

        DB::transaction(function() use ($question, $questionCategory) {

            $question->save();

            /*
             * insert new record for question category
             */
            $questionCategory->question_id = $question->id;
            $questionCategory->save();
        });

22voto

imal365 Points 39

Je suis sûr que vous ne cherchez pas une solution de fermeture, essayez ceci pour une solution plus compacte.

 try{
    DB::beginTransaction();

    /*
     * Your DB code
     * */

    DB::commit();
}catch(\Exception $e){
    DB::rollback();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X