Detaillierte Erklärung, wie Laravel Datenbanktransaktionen und Ausnahmebehandlung verwendet

*文
Freigeben: 2023-03-19 08:52:01
Original
2399 Leute haben es durchsucht

Ich habe Laravel kürzlich gelernt und bin beim Lernen auf viele Probleme gestoßen. Deshalb möchte ich es zusammenfassen und aufzeichnen. Daher stellt Ihnen der folgende Artikel hauptsächlich die relevanten Informationen darüber vor, wie Laravel Datenbanktransaktionen verwendet und Ausnahmen nach Transaktionsfehlern erfasst . Freunde in Not können sich darauf beziehen, schauen wir uns unten um.

Vorwort

Wenn Sie eine Reihe von Vorgängen in einer Datenbanktransaktion in Laravel ausführen möchten, können Sie die Transaktionsmethode in der Datenbank verwenden Fassade. Wenn beim Schließen einer Transaktion eine Ausnahme ausgelöst wird, wird die Transaktion automatisch wiederhergestellt. Wenn der Abschluss erfolgreich ausgeführt wird, wird die Transaktion automatisch festgeschrieben.

Sie müssen sich keine Gedanken über die manuelle Wiederherstellung oder Festschreibung der Transaktion machen, wenn Sie die Transaktionsmethode verwenden:

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

 DB::table('posts')->delete();
});
Nach dem Login kopieren

Manuelle Durchführung der Transaktion

Wenn Sie Transaktionen manuell verarbeiten und die volle Kontrolle über den Wiederherstellungs- oder Festschreibungsvorgang haben möchten, können Sie die beginTransaction-Methode auf der DB-Fassade verwenden:

DB::beginTransaction();
Nach dem Login kopieren

Sie können die Transaktion auch über das RollBack wiederherstellen Methode:

DB::rollBack();
Nach dem Login kopieren

Schließlich können Sie die Transaktion über die Commit-Methode übermitteln:

DB::commit();
Nach dem Login kopieren

Hinweis: Die Transaktionsmethode von Die DB-Fassade kann auch zur Steuerung des Abfrageanweisungskonstruktors und von Eloquent ORM-Angelegenheiten verwendet werden.

Beispieleinführung

Angenommen, Sie möchten einen Wissenspunkt in der Datenbank speichern und dieser Wissenspunkt gehört zu zwei verschiedenen Tests Punkte gleichzeitig, das heißt, die beiden Daten Testpunkte und Wissenspunkte stehen in einer Viele-zu-Viele-Beziehung. Um diese Datenstruktur zu implementieren, sind daher drei Tabellen erforderlich:

Wiki zur Wissenspunkttabelle:

---------------------------------------
id  title    content
---------------------------------------
Nach dem Login kopieren

Tag der Testpunkttabelle:

-------------------
id  name
-------------------
Nach dem Login kopieren

Testpunkt-Wissenspunktzuordnungstabelle wiki_tag_rel

----------------------------------
id   tag_id  wiki_id
----------------------------------
Nach dem Login kopieren

Jetzt müssen wir die Transaktion öffnen, um Wiki-Daten hinzuzufügen Nachdem das Wiki erfolgreich hinzugefügt wurde, verknüpfen Sie es mit den angegebenen Gehe zu den Testpunkten

(Wenn Sie den Abfrage-Builder oder Eloquent ORM verwenden, um die Abfrage in Laravel auszuführen, wird eine IlluminateDatabaseQueryException-Ausnahme zurückgegeben, wenn sie fehlschlägt)

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

}
Nach dem Login kopieren

Verwandte Empfehlungen:

Erklären Sie ausführlich, wie Laravel die .env-Konfiguration im Hintergrund ändert

Erkunden Sie, wie die Middleware von Laravel implementiert wird

Laravel optimierte Split-Routing-Datei

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung, wie Laravel Datenbanktransaktionen und Ausnahmebehandlung verwendet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!