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(); });
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();
Sie können die Transaktion auch über das RollBack wiederherstellen Methode:
DB::rollBack();
Schließlich können Sie die Transaktion über die Commit-Methode übermitteln:
DB::commit();
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 ---------------------------------------
Tag der Testpunkttabelle:
------------------- id name -------------------
Testpunkt-Wissenspunktzuordnungstabelle wiki_tag_rel
---------------------------------- id tag_id wiki_id ----------------------------------
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(',', $request->get('tag_id')); $wiki_id = DB::table('wiki')->insertGetId([ 'title' => $request->get('title'), 'content' => $request->get('content') ]); $relationData = []; foreach($tagIds as $tagId) { $data = ['wiki_id' => $wiki_id, 'tag_id' => $tagId]; $relationData[] = $data; } DB::table('wiki_tag_rel')->insert($relationData); DB::commit(); } catch(\Illuminate\Database\QueryException $ex) { DB::rollback(); return \Response::json(['status' => 'error', 'error_msg' => 'Failed, please contact supervisor']); } return \Response::json(['status' => 'ok']); } //用DB facade的事务方法控制 Eloquent ORM的事务 public function createWiki(array $data) { DB::beginTransaction(); try { $tagIds = explode(',', $data['tag_id']); $newWiki = Wiki::create([ 'title' => $data['title'], 'content' => $data['content'] ]); //Wiki和Tag两个Model使用了belongsToMany建立了多对多的关系 //通过attach方法来附加wiki和tag的关系(写入中间表) $newWiki->tags()->attach($tagIds); DB::commit(); } catch(QueryException $ex) { DB::rollback(); return \Response::json(['status' => 'error', 'error_msg' => 'Failed, please contact supervisor']); } return \Response::json(['status' => 'ok']); } }
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!