Laravel이 데이터베이스 트랜잭션 및 예외 처리를 사용하는 방법에 대한 자세한 설명

*文
풀어 주다: 2023-03-19 08:52:01
원래의
2398명이 탐색했습니다.

최근 Laravel을 배우면서 많은 문제에 부딪혔기 때문에 이를 요약해서 기록하고 싶었습니다. 그래서 다음 글에서는 주로 Laravel이 데이터베이스 트랜잭션을 사용하고 트랜잭션 실패 후 예외를 캡처하는 방법에 대한 관련 정보를 소개합니다. 친구가 참조할 수 있어야 합니다. 아래를 살펴보겠습니다.

머리말

Laravel의 데이터베이스 트랜잭션에서 일련의 작업을 실행하려면 DB Facade에서 트랜잭션 메서드를 사용할 수 있습니다. 트랜잭션 종료 내에서 예외가 발생하면 트랜잭션이 자동으로 복원됩니다. 클로저가 성공적으로 실행되면 트랜잭션이 자동으로 커밋됩니다.

트랜잭션 방법을 사용할 때 트랜잭션을 수동으로 되돌리거나 커밋하는 것에 대해 걱정할 필요가 없습니다.

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

 DB::table('posts')->delete();
});
로그인 후 복사

수동으로 트랜잭션을 운영

트랜잭션을 수동으로 처리하고 복원 또는 커밋 작업을 완전히 제어하려면 DB 파사드는 startTransaction 메소드를 사용합니다:

DB::beginTransaction();
로그인 후 복사

rollBack 메소드를 통해 트랜잭션을 복원할 수도 있습니다:

DB::rollBack();
로그인 후 복사

마지막으로 커밋 메소드를 통해 트랜잭션을 제출할 수 있습니다:

DB::commit();
로그인 후 복사

참고: 트랜잭션 메소드 DB Facade의 쿼리 문 작성기와 Eloquent ORM 트랜잭션을 제어하는 ​​데에도 사용할 수 있습니다.

예제 소개

이 지식 포인트가 동시에 두 개의 다른 테스트 포인트에 속한다고 가정해 보겠습니다. 즉, 테스트 포인트와 지식의 두 데이터입니다. 포인트는 다대다 관계를 갖습니다. 그런 다음 이 데이터 구조를 구현하려면 세 개의 테이블이 필요합니다:

지식 포인트 테이블 wiki:

---------------------------------------
id  title    content
---------------------------------------
로그인 후 복사

테스트 포인트 테이블 태그:

-------------------
id  name
-------------------
로그인 후 복사

테스트 포인트 지식 포인트 연관 테이블 wiki_tag_rel

----------------------------------
id   tag_id  wiki_id
----------------------------------
로그인 후 복사

이제 Wiki 데이터를 추가하기 위해 트랜잭션을 열어야 합니다. Wiki가 성공한 후 이를 지정된 테스트 포인트에 연결해야 합니다

(쿼리 빌더 또는 Eloquent ORM을 사용하여 laravel에서 쿼리를 실행할 때 IlluminateDatabaseQueryException 예외가 반환됩니다) 실패하는 경우)

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

}
로그인 후 복사

관련 권장 사항:

자세한 설명 Laravel이 백그라운드를 통해 .env 구성을 수정하는 방법

Laravel의 미들웨어가 구현되는 방법을 살펴보세요

Laravel 최적화 분할 라우팅 파일

위 내용은 Laravel이 데이터베이스 트랜잭션 및 예외 처리를 사용하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!