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

*文
Libérer: 2023-03-19 08:52:01
original
2399 Les gens l'ont consulté

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();
});
Copier après la connexion

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();
Copier après la connexion

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

DB::rollBack();
Copier après la connexion

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

DB::commit();
Copier après la connexion

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
---------------------------------------
Copier après la connexion

Balise de la table des points de test :

-------------------
id  name
-------------------
Copier après la connexion

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

----------------------------------
id   tag_id  wiki_id
----------------------------------
Copier après la connexion

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;]);
  }

}
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!