Laravelでのトランザクション

Susan Sarandon
リリース: 2024-10-22 08:07:02
オリジナル
415 人が閲覧しました

Transacciones en laravel

場合によっては、一連の連続した操作を実行する必要があり、中途半端な作業が残されることなく、すべてが正常に完了することが重要です。

一般的な例はユーザーの作成です。この場合、役割も割り当てられ、登録メールが送信されることが重要です。

このような種類の状況に対処するには、トランザクションが使用されます。ここでは、ユーザーを作成し、ロールを割り当て、sendEmail() メソッドを介して電子メールを送信するメソッドを示します。このメソッドは電子メールを引数として受け取り、それに応じて送信します。

use Illuminate\Support\Facades\DB;

public function save(array $data)
{
    try {
           $user = User::create($data);

           $user->syncRoles([$data['role']]);

           $this->sendEmail([
                'email' => $data['email'],
           ]);

            return $user;
   } catch (\Exception $e) {
          throw new BadRequestException("Error al guardar nuevo usuario");
   }
}
ログイン後にコピー

3 つのメソッドを適用する必要があります:

  • DB::beginTransaction();トランザクションを開始します
  • DB::コミット();変更を確認します
  • DB::ロールバック();操作を実行できない場合は、すべての変更が元に戻り、トランザクションの開始前と同じ状態になります。

前のコードでのトランザクションの実装は次のとおりです。

use Illuminate\Support\Facades\DB;

public function save(array $data)
{
     // Iniciar la transacción
     DB::beginTransaction();
     try {

        $user = User::create($data);

        $user->syncRoles([$data['role']]);

        $this->sendEmail([
             'email' => $data['email'],
        ]);

        // Confirmo la transacción
        DB::commit();

        return $user;
     } catch (\Exception $e) {
        // Si falla hago rollback
        DB::rollback();

        throw new BadRequestException("Error al guardar nuevo usuario");
     }
 }
ログイン後にコピー

これにより、一連の操作が完全に実行されるか、まったく実行されないかが保証されます。

Laravel は、DB ファサードの別のより具体的なトランザクション メソッドも提供します。この場合、コミットとロールバックは自動的に行われます。これは、操作の数が少ない場合、またはロールバックを実行する前に追加の操作が必要ない場合に推奨されます

DB::transaction(function () use($data){

  $user = User::create($data);

  $user->syncRoles([$data['role']]);

  $this->sendEmail([
      'email' => $data['email'],
  ]);

  return $user;
});
ログイン後にコピー

重要: データベース エンジンに関する考慮事項
すべてのストレージ エンジンがトランザクションをサポートしているわけではありません。 InnoDB はトランザクションをサポートするエンジンですが、MyISAM はサポートしません。データベース テーブルが正しく機能するには、トランザクションをサポートするエンジンを使用していることを確認することが重要です。

以上がLaravelでのトランザクションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!