최근 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(',', $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']); } }
관련 권장 사항:
자세한 설명 Laravel이 백그라운드를 통해 .env 구성을 수정하는 방법
위 내용은 Laravel이 데이터베이스 트랜잭션 및 예외 처리를 사용하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!