LaravelでDB操作をしたい場合、TinkerでDBを操作することが可能です。
(いちいちMySQLコマンドを叩かなくて済みます)
その際、間違って更新したくないデータを書き換えてしまった場合、
MySQLのようにロールバックする必要が出てくるかと思います。
今回はTinkerでトランザクション処理をする実行する方法について解説します。
具体的には、以下のコマンドでできます。
## トランザクション開始
DB::beginTransaction()
## ロールバック
DB::rollBack()
## トランザクションをコミット
DB::commit()
MySQLコマンドを叩いたことがある人にとってはすぐわかるかと思いますが、具体例と共に説明します。
まずは、以下のUserデータがあるとします。
これのnameを更新して戻す操作を実施したいと思います。
> User::first()
= App\Models\User {#7421
id: 1,
name: "test-user", ## ★更新対象
email: "test123@gmail.com",
email_verified_at: null,
#password: "$2y$10$tjDxajVvG8VDhFJyuMExxeckCKXFAnvpGqkcda62cFY/vCeZXUCwa",
#two_factor_secret: null,
#two_factor_recovery_codes: null,
two_factor_confirmed_at: null,
#remember_token: null,
current_team_id: null,
profile_photo_path: null,
created_at: "2023-07-24 12:32:48",
updated_at: "2023-07-24 12:32:48",
+profile_photo_url: "https://ui-avatars.com/api/?name=t&color=7F9CF5&background=EBF4FF",
}
まず、トランザクションを開始します。
次にUserデータを取得してnameを書き換え、更新(save)まで実施します。
これにより、Userデータのnameが更新されることになりますが、
次のDB::rollback()を実施することで、nameの更新が無かったことになります。
元のUserデータを取得してnameを確認すると、更新前のままとなっています。
## トランザクション開始
> DB::beginTransaction()
#= null
> $user = User::first()
> $user->name = "新しい名前のユーザーネーム"
> $user->save()
#= true
> $user->name
#= "新しい名前のユーザーネーム"
## ロールバック
> DB::rollBack()
#= null
## nameが元のままで、更新が無かったことになっている
> User::first()->name
= "test-user"
もし、更新するデータに問題がなくロールバックしないのなら、
以下のようにコミットすることで更新が適用されます。
> DB::beginTransaction()
= null
> $user = User::first()
> $user->name = "更新完了ユーザーネーム"
= "更新完了ユーザーネーム"
> $user->save()
= true
## コミット
> DB::commit()
= null
> User::first()->name
= "更新完了ユーザーネーム"
上記のトランザクション処理を実行することで、
本番環境でも安全に作業することができるようになります。
参考