Les transactions ORM éloquentes de Laravel

L'Orme éloquent est assez agréable, bien que je me demande s'il y a un moyen facile de configurer des transactions MySQL en utilisant innoDB de la même manière que PDO, ou si je devrais étendre l'ORM pour rendre cela possible?

65
demandé sur wesside 2013-02-27 10:33:30

7 réponses

Vous pouvez faire ceci:

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

Tout ce qui se trouve à l'intérieur de la fermeture est exécuté dans le cadre d'une transaction. Si une exception se produit, il annulera automatiquement.

125
répondu Laurence 2017-04-29 19:35:15

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, l'objet pdo n'est plus public donc:

try {
    DB::beginTransaction();
    // database queries here
    DB::commit();
} catch (\PDOException $e) {
    // Woopsy
    DB::rollBack();
}
74
répondu Jürgen Paul 2017-11-09 23:16:19

si vous voulez utiliser Eloquent, vous pouvez aussi utiliser ce

c'est juste un exemple de code 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();
        });
24
répondu Aditya Kresna Permana 2015-05-14 14:04:14

si vous voulez éviter les fermetures, et heureux d'utiliser les façades, ce qui suit garde les choses belles et propres:

\DB::beginTransaction();

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

\DB::commit();

si une déclaration échoue, commit ne sera jamais lancé, et la transaction ne sera pas traiter.

13
répondu Chris 2015-06-17 12:13:30

pour une raison quelconque, il est assez difficile de trouver cette information n'importe où, donc j'ai décidé de la poster ici, car mon problème, bien que lié à des transactions éloquentes, était exactement changer cela.

après avoir lu THIS stackoverflow answer, j'ai réalisé que mes tables de base de données utilisaient MyISAM au lieu D'InnoDB.

pour que les transactions fonctionnent sur Laravel (ou n'importe où ailleurs comme il semble), il est nécessaire que vos tables sont définis pour utiliser InnoDB

pourquoi?

, Citant MySQL les Transactions et les Opérations Atomiques docs ( ici ):

MySQL Server (version 3.23-max et toutes les versions 4.0 et supérieures) prend en charge les transactions avec les moteurs de stockage Transactionnels InnoDB et BDB. InnoDB fournit une conformité complète à L'acide. Voir Chapitre 14, Moteurs De Stockage. Pour plus d'informations sur InnoDB différences par rapport à la norme SQL en ce qui concerne le traitement des erreurs de transaction, voir la Section 14.2.11, "traitement des erreurs InnoDB".

les autres moteurs de stockage non transactionnel dans MySQL Server (tels que MyISAM) suivent un paradigme différent pour l'intégrité des données appelé "opérations atomiques."En termes transactionnels, les tables MyISAM fonctionnent toujours en mode autocommit = 1. Les opérations atomiques offrent souvent une intégrité comparable avec des performances plus élevées.

parce que MySQL Server prend en charge les deux paradigmes, vous pouvez décider si vos applications sont mieux servies par la vitesse des opérations atomiques ou l'utilisation de fonctionnalités transactionnelles. Ce choix peut être fait sur une table par table.

8
répondu dmmd 2017-05-23 12:34:45

je suis sûr que vous n'êtes pas à la recherche d'une solution de fermeture, essayez ceci pour une solution plus compacte

 try{
    DB::beginTransaction();

    /*
     * Your DB code
     * */

    DB::commit();
}catch(\Exception $e){
    DB::rollback();
}
8
répondu imal hasaranga perera 2016-06-07 04:23:26

si une exception se produit, la transaction sera automatiquement annulée.

Laravel de transactions de Base format

    try{
    DB::beginTransaction();

    /* 
    * SQL operation one 
    * SQL operation two
    ..................     
    ..................     
    * SQL operation n */


    DB::commit();
   /* Transaction successful. */
}catch(\Exception $e){       

    DB::rollback();
    /* Transaction failed. */
}
2
répondu srmilon 2017-05-22 19:19:43