laravel 商品购买 中商品数据锁定及事务的处理方式
//laravel 商品购买 中商品数据锁定及事务的处理方式 // 商品购买处理 public function merchandiseItemBuyProcess($merchandise_id) { // 接收输入资料 $input = request()->all(); // 验证规则 $rules = [ // 商品购买数量 'buy_count' => [ 'required', 'integer', 'min:1', ], ]; // 验证资料 $validator = Validator::make($input, $rules); if ($validator->fails()) { // 资料验证错误 return redirect('/merchandise/' . $merchandise_id) ->withErrors($validator) ->withInput(); } try { // 取得登入会员资料 $user_id = session()->get('user_id'); $User = User::findOrFail($user_id); // 交易开始 DB::beginTransaction(); // 取得商品资料 $Merchandise = Merchandise::findOrFail($merchandise_id); // 购买数量 $buy_count = $input['buy_count']; // 购买后剩馀数量 $remain_count_after_buy = $Merchandise->remain_count - $buy_count; if ($remain_count_after_buy < 0) { // 购买后剩馀数量小于 0,不足以卖给使用者 throw new Exception('商品数量不足,无法购买'); } // 纪录购买后剩余数量 $Merchandise->remain_count = $remain_count_after_buy; $Merchandise->save(); // 总金额:总购买数量 * 商品价格 $total_price = $buy_count * $Merchandise->price; $transaction_data = [ 'user_id' => $User->id, 'merchandise_id' => $Merchandise->id, 'price' => $Merchandise->price, 'buy_count' => $buy_count, 'total_price' => $total_price, ]; // 建立交易资料 Transaction::create($transaction_data); // 交易结束 DB::commit(); // 回传购物成功讯息 $message = [ 'msg' => [ trans('shop.merchandise.purchase-success'), ], ]; return redirect() ->to('/merchandise/' . $Merchandise->id) ->withErrors($message); } catch (Exception $exception) { // 恢复原先交易状态 DB::rollBack(); // 回传错误讯息 $error_message = [ 'msg' => [ $exception->getMessage(), ], ]; return redirect() ->back() ->withErrors($error_message) ->withInput(); } }