Maison  >  Article  >  développement back-end  >  Explication détaillée de la façon dont Laravel utilise les transactions de base de données et la gestion des exceptions

Explication détaillée de la façon dont Laravel utilise les transactions de base de données et la gestion des exceptions

*文
*文original
2018-01-03 17:30:222395parcourir

J'ai récemment appris Laravel et j'ai rencontré beaucoup de problèmes lors de mon apprentissage, je voulais donc le résumer et l'enregistrer. L'article suivant vous présente donc principalement les informations pertinentes sur la façon dont Laravel utilise les transactions de base de données et capture les exceptions après des échecs de transaction. . , les amis dans le besoin peuvent s'y référer, jetons un oeil ci-dessous.

Préface

Si vous souhaitez exécuter un ensemble d'opérations dans une transaction de base de données dans Laravel, vous pouvez utiliser la méthode de transaction dans la base de données façade. Si une exception est levée lors de la clôture d'une transaction, la transaction sera automatiquement restaurée. Si la clôture réussit, la transaction sera automatiquement validée.

Vous n'avez pas à vous soucier de la restauration ou de la validation manuelle de la transaction lorsque vous utilisez la méthode de transaction :

DB::transaction(function () {
 DB::table('users')->update(['votes' => 1]);

 DB::table('posts')->delete();
});

Opération manuelle de la transaction

Si vous souhaitez gérer la transaction manuellement et avoir un contrôle total sur l'opération de restauration ou de validation, vous pouvez utiliser la méthode beginTransaction sur la façade de la base de données :

DB::beginTransaction();

Vous pouvez également restaurer la transaction via le Méthode rollBack :

DB::rollBack();

Enfin, la transaction peut être soumise via la méthode de validation :

DB::commit();

Remarque : La méthode de transaction de la façade de base de données peut également être utilisée pour contrôler le constructeur d'instructions de requête et les questions Eloquent ORM.

Exemple d'introduction

Supposons que vous souhaitiez stocker un point de connaissance dans la base de données et que ce point de connaissance appartient à deux tests différents points en même temps , c'est-à-dire que les deux données des points de test et des points de connaissance ont une relation plusieurs-à-plusieurs, donc pour implémenter cette structure de données, trois tables sont nécessaires :

Wiki des tables de points de connaissance :

---------------------------------------
id  title    content
---------------------------------------

Balise de la table des points de test :

-------------------
id  name
-------------------

Table d'association des points de connaissance des points de test wiki_tag_rel

----------------------------------
id   tag_id  wiki_id
----------------------------------

Maintenant, nous devons ouvrir la transaction pour ajouter des données Wiki . Une fois le wiki ajouté avec succès, associez-le aux points Go to test

spécifiés (lors de l'utilisation du générateur de requêtes ou d'Eloquent ORM pour exécuter la requête dans Laravel, une exception IlluminateDatabaseQueryException sera renvoyée en cas d'échec)

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Database\QueryException;
use App\Wiki;

class TestController extends Controller
{
 //用DB facade的事务方法控制 查询语句构建器的事务
 public function storeWiki(Request $request)
 {
  DB::beginTransaction();
  try {
   $tagIds = explode(&#39;,&#39;, $request->get(&#39;tag_id&#39;));
   $wiki_id = DB::table(&#39;wiki&#39;)->insertGetId([
    &#39;title&#39; => $request->get(&#39;title&#39;),
    &#39;content&#39; => $request->get(&#39;content&#39;)
   ]);

   $relationData = [];
   foreach($tagIds as $tagId) {
    $data = [&#39;wiki_id&#39; => $wiki_id, &#39;tag_id&#39; => $tagId];
    $relationData[] = $data;
   }
   DB::table(&#39;wiki_tag_rel&#39;)->insert($relationData);
   DB::commit();
  } catch(\Illuminate\Database\QueryException $ex) {
   DB::rollback();
   return \Response::json([&#39;status&#39; => &#39;error&#39;, &#39;error_msg&#39; => &#39;Failed, please contact supervisor&#39;]);
  }
  
  return \Response::json([&#39;status&#39; => &#39;ok&#39;]);
 }


 //用DB facade的事务方法控制 Eloquent ORM的事务
 public function createWiki(array $data)
 {
  DB::beginTransaction();
  try {
   $tagIds = explode(&#39;,&#39;, $data[&#39;tag_id&#39;]);
   $newWiki = Wiki::create([
    &#39;title&#39; => $data[&#39;title&#39;],
    &#39;content&#39; => $data[&#39;content&#39;]
   ]);
   //Wiki和Tag两个Model使用了belongsToMany建立了多对多的关系
   //通过attach方法来附加wiki和tag的关系(写入中间表)
   $newWiki->tags()->attach($tagIds);
   DB::commit();
  } catch(QueryException $ex) {
   DB::rollback();
   return \Response::json([&#39;status&#39; => &#39;error&#39;, &#39;error_msg&#39; => &#39;Failed, please contact supervisor&#39;]);
  }

  return \Response::json([&#39;status&#39; => &#39;ok&#39;]);
  }

}

Recommandations associées :

Expliquez en détail comment Laravel modifie la configuration .env en arrière-plan

Découvrez comment le middleware de Laravel est implémenté

Fichier de routage fractionné optimisé Laravel

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn