久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

Laravel如何使用數據庫事務及捕獲事務失敗后的異常詳解

最近在學習Laravel,在學習中遇到了不少的問題,所以想著總結記錄下來,所以下面這篇文章主要給大家介紹了關于Laravel如何使用數據庫事務及捕獲事務失敗后異常的相關資料,需要的朋

前言

如果大家在Laravel中要想在數據庫事務中運行一組操作,則可以在 DB facade 中使用 transaction 方法。如果在事務的閉包內拋出異常,事務將會被自動還原。如果閉包運行成功,事務將被自動提交。

你不需要擔心在使用 transaction 方法時還需要親自去手動還原或提交事務:

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

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

手動操作事務

如果你想手動處理事務并對還原或提交操作進行完全控制,則可以在 DB facade 使用 beginTransaction 方法:

DB::beginTransaction();

你也可以通過 rollBack 方法來還原事務:

DB::rollBack();

最后,可以通過 commit 方法來提交這個事務:

DB::commit();

注意: DB facade 的事務方法也可以用來控制 查詢語句構造器 及 Eloquent ORM 的事務。

示例介紹

假設有要在數據庫中存儲一個知識點,這個知識點同時屬于兩個不同的考點,也就是考點和知識點這兩個數據是多對多的關系,那么要實現這種數據結構就需要三個表:

知識點表 wiki:

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

考點表 tag:

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

考點知識點關聯表 wiki_tag_rel

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

現在要開啟事務新增Wiki數據,新增wiki成功后再把它關聯到指定的考點上去

(在laravel中使用查詢構建器或者Eloquent ORM執行query時,如果失敗會返回 Illuminate\Database\QueryException 異常)

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

}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對的支持。

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

下面小編就為大家分享一篇laravel ORM 只開啟created_at的幾種方法總結,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要給大家介紹了如何通過源碼解析Laravel的依賴注入的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著
這篇文章主要給大家介紹了關于Laravel中unique和exists驗證規則的優化的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面
最近在使用laravel5.5,利用其實現了一個功能,下面分享給大家,這篇文章主要給大家介紹了關于Laravel 5.5基于內置的Auth模塊如何實現前后臺登陸的相關資料,文中通過示例代碼介紹的非
laravel 的隊列服務對各種不同的后臺隊列服務提供了統一的 API,下面這篇文章通過源碼分析給大家介紹了關于 Laravel 重復執行同一個隊列任務的原因,文中通過示例代碼介紹的非常詳細
這篇文章主要給大家介紹了關于 Laravel Redis 多個進程同時取隊列問題的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或工作具有一定的參考學習價值,需要的朋友下面來
主站蜘蛛池模板: 四虎黄色网址 | 伊人久久综合 | 久久av一区二区三区亚洲 | 天天操天天看 | 91免费黄| 少妇高潮av久久久久久 | 操综合| 91看片在线观看 | 黄色小视频免费看 | 国产精品一区一区三区 | 日韩毛片视频 | 我要看一级片 | 精品国产91| 最近日本中文字幕 | 国产黄色免费观看 | 久久精品欧美一区二区三区不卡 | 国产精品日韩在线 | 日韩色在线 | 欧美成人极品 | 日韩高清一区 | 美国一级大黄一片免费中文 | 精品一区二区国产 | 黄色片中文字幕 | 国产一级视频在线观看 | www.日韩av| 国产精品久久久久久久午夜 | 成人在线观看网站 | 综合色婷婷一区二区亚洲欧美国产 | 日韩精品中文字幕在线观看 | 日韩欧美视频一区 | 毛片视频免费 | 天天干天天操天天插 | 国产精品日韩精品 | 一二三四区在线观看 | 国产小视频在线 | 国产视频黄色 | 特级特黄aaaa免费看 | 国产理论视频 | 中国少妇xxxxhd做受 | 综合网伊人 | 久久综合国产 |