[Laravel] DB::transaction() 内で生成したオブジェクトをメソッドの外で使いたい
Laravel のトランザクションには、2 通りの書き方がある。
1 つは、try catch を使う方法。
DB::transaction();
try {
$user = User::create($request->all());
DB::commit();
} catch (\Exception $e) {
DB::rollback();
}もう 1 つは、DB::transaction() を使う方法。
DB::transaction(function () use ($request) {
$user = User::create($request->all());
});後者のほうがきれいで読みやすいけれど、後者では transaction の外で $user を参照できないので、
transaction のなかで生成したモデルを transation の外で使いたい場合に困ってしまう。
public function store(Request $request)
{
DB::transaction(function() use($request){
$user = User::create($request->all());
});
// $userを参照できない!
return redirect()->route('user.show', compact('user'));
}解決方法
それを解決する方法として、DB::transaction() が $user を返すようにする、というのがある。
$user = DB::transaction(function () use ($request) {
return User::create($request->all());
});これなら、以下のコードでも困らない。
public function store(Request $request)
{
$user = DB::transaction(function() use($request){
return User::create($request->all());
});
// $userを参照できる!
return redirect()->route('user.show', compact('user'));
}You can return a value from the transaction method
— Taylor Otwell 🏝 (@taylorotwell) 2018年5月31日