web-dev-qa-db-ja.com

PHPおよびlaravelでのTry / Catchおよびデータベーストランザクションの使用方法

Laravel5でTry/Catchとデータベーストランザクションを使用する予定で、独自のPHPプロジェクトを検証してエラーが発生したことを確認し、ユーザーがデータベースへのトランザクションを実行しているときにトランザクションまたは情報が失われないようにロールバックします。一部のメソッドが成功ステータスまたは非成功ステータスで実行されたかどうかは確実にわかりますが、特にBeginTransaction()およびCommit()を使用したデータベーストランザクションでの試行/キャッチについては、Larvel5の組み込みメソッドRollback()についてはまだよくわかりません。私はこの関数を実行しましたが、最後にそれらのトランザクション中に発生するエラータイプの数がわかりません。いつ、どのようにして(エラーが発生した場合)エラーを見つけてユーザーに戻りますか?DB :: commit()メソッドのReturnすべてのステータスをエンドユーザーに返しますが、エラーが発生した場合、catchがそのタスクを実行し、それらのエラーの種類はどのようになりますか?例:\

public function my_method(){
DB::beginTransaction():
try {
    $this->data['a'] =  $this->select();
    $this->data['b'] =  $this->delete();
    $this->data['c'] =  $this->update();
    $this->data['d'] =  $this->insert();
DB::commit();
return ['data'=>$this->data];
       //I planing return all the return back from each method to user.
} catch(EXCEPTION $e){
           DB::rollback()
            throw $e
           }
}

private update(){ if(done){return true}}
private delete(){ if(done){return true}}
private insert(){ if(done){return true}}
private select(){ if(done){return true}}
1
Heng Sopheak

まず、PHPはクラスの大文字と小文字を区別しませんが、読みやすいようにEXCEPTIONExceptionに書き換えます。また、いくつかのセミコロン。まずはこれらのいくつかを修正します。

私はLaravelデータベースクラスに精通していませんが、Eloquentを使用していると思いますか?そうであれば、\Illuminate\Database\QueryException try catchブロックの例外で、ロールバックをそのように処理します。このようなものはうまくいくはずです:

    try {
        // do your database transaction here
    } catch (\Illuminate\Database\QueryException $e) {
        // something went wrong with the transaction, rollback
    } catch (\Exception $e) {
        // something went wrong elsewhere, handle gracefully
    }

https://laravel.com/api/5.2/Illuminate/Database/QueryException.html

ストレートアップPDOを使用している場合は、上記と同じ戦略を試すことをお勧めしますが、代わりにPDOException例外を使用します。

http://php.net/manual/en/class.pdoexception.php

5
user229034