Wenn Sie in Laravel eine Reihe von Vorgängen in einer Datenbanktransaktion ausführen möchten, können Sie die Transaktionsmethode in der DB-Fassade verwenden. 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 darüber machen, die Transaktion manuell rückgängig zu machen oder zu bestätigen, wenn Sie die Transaktionsmethode verwenden:
DB::transaction(function () { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete(); });
Manuelles Ausführen der Transaktion
Wenn Sie die Transaktion manuell bearbeiten und durchführen möchten Wiederherstellungs- oder Commit-Vorgang Wenn Sie die volle Kontrolle haben, können Sie die beginTransaction
-Methode auf der DB-Fassade verwenden:
DB::beginTransaction();
Sie können die Transaktion auch über die RollBack-Methode wiederherstellen:
DB::rollBack();
Schließlich können Sie es über die Commit-Methode senden. Diese Transaktion:
DB::commit();
Hinweis: Die Transaktionsmethode der DB-Fassade kann auch verwendet werden, um die Transaktion des Abfrageanweisungs-Builders und des Eloquent ORM zu steuern.
Angenommen, Sie möchten einen Wissenspunkt in der Datenbank speichern. Dieser Wissenspunkt gehört zu zwei verschiedenen Testpunkten gleichzeitig Wenn es sich bei den Punkten um eine Viele-zu-Viele-Beziehung handelt, werden drei Tabellen benötigt, um diese Datenstruktur zu implementieren:
Wiki zur Wissenspunkttabelle:
--------------------------------------- id title content ---------------------------------------
Tag der Testpunkttabelle:
------------------- id name -------------------
Testpunktwissen Klicken Sie auf die Zuordnungstabelle wiki_tag_rel
---------------------------------- id tag_id wiki_id ----------------------------------
Jetzt müssen Sie die Transaktion öffnen, um Wiki-Daten hinzuzufügen. Nachdem das neue Wiki erfolgreich hinzugefügt wurde, verknüpfen Sie es mit dem angegebenen Testpunkt
(Verwenden Sie den Abfrage-Builder in Laravel. Oder wenn Eloquent ORM eine Abfrage ausführt und diese fehlschlägt, wird IlluminateDatabaseQueryException zurückgegeben)
<?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']); } }
Wenn Sie in Laravel eine Reihe von Vorgängen in einer Datenbanktransaktion ausführen möchten, können Sie die Transaktionsmethode in verwenden DB-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 darüber machen, die Transaktion manuell rückgängig zu machen oder zu bestätigen, wenn Sie die Transaktionsmethode verwenden:
DB::transaction(function () { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete(); });
Manuelles Ausführen der Transaktion
Wenn Sie die Transaktion manuell bearbeiten und durchführen möchten Wiederherstellungs- oder Commit-Vorgang Wenn Sie die volle Kontrolle haben, können Sie die beginTransaction
-Methode auf der DB-Fassade verwenden:
DB::beginTransaction();
Sie können die Transaktion auch über die RollBack-Methode wiederherstellen:
DB::rollBack();
Schließlich können Sie es über die Commit-Methode senden. Diese Transaktion:
DB::commit();
Hinweis: Die Transaktionsmethode der DB-Fassade kann auch verwendet werden, um die Transaktion des Abfrageanweisungs-Builders und des Eloquent ORM zu steuern.
Angenommen, Sie möchten einen Wissenspunkt in der Datenbank speichern. Dieser Wissenspunkt gehört zu zwei verschiedenen Testpunkten gleichzeitig Punkte sind eine Viele-zu-Viele-Beziehung, dann werden drei Tabellen benötigt, um diese Datenstruktur zu implementieren:
Wiki zur Wissenspunkttabelle:
--------------------------------------- id title content ---------------------------------------
Tag der Testpunkttabelle:
------------------- id name -------------------
Testpunktwissen Klicken Sie auf die Zuordnungstabelle wiki_tag_rel
---------------------------------- id tag_id wiki_id ----------------------------------
Jetzt müssen Sie die Transaktion öffnen, um Wiki-Daten hinzuzufügen. Nachdem das neue Wiki erfolgreich hinzugefügt wurde, verknüpfen Sie es mit dem angegebenen Testpunkt
(Verwenden Sie den Abfrage-Builder in Laravel. Oder wenn Eloquent ORM eine Abfrage ausführt und diese fehlschlägt, wird eine IlluminateDatabaseQueryException-Ausnahme zurückgegeben.)
<?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']); } }
Weitere verwandte Artikel zur Verwendung von Datenbanktransaktionen in Laravel und das Erfassen von Ausnahmen nach Transaktionsfehlern beachten Sie bitte die chinesische PHP-Website!