laravel 商品购买 中商品数据锁定及事务的处理方式

 Laravel  2019-03-05  admin  2554  3447

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();
        }
    }


如果文章对您有帮助,点击下方的广告,支持一下作者吧!

相关推荐


Systemd Web 管理系统:简化服务管理

# Systemd Web Systemd Web 是一个 Systemd 的 Web UI 管理系统,通过直观的界面和易用的操作,让用户能够轻松地管理 Linux 系统和服务。该项目旨在简化 Systemd 的使用,使得无论是专业的系统管理员还是普通的用户,都能够方便地对系统进行操作。 ## [github地址] (https://github.com/topascend/systemd

laravel 自定义写入日志

laravel 自定义写入日志if(!function_exists(&#39;myLog&#39;)){ /** *生成自定义文件日志内容 *@param$data *@paramstring$title *@parambool$isClear *@returnvoid *@Author:cent123.com */ functionmyLog($data,string$tit

systemctl 使用

Systemd是Linux系统工具,用来启动守护进程,已成为大多数发行版的标准配置。而systemctl是Systemd的主命令,用于管理系统。其实我们大部分服务都有使用systemctl管理,比如MySQL、Nginx等等。常见配置如下:[Unit] #单元描述 Description=GFAPP #在什么服务启动之后再执行本程序 After=mysql.service [Serv

封装 laravel 的公共队列,延迟处理任务

封装 laravel 的公共队列,延迟处理任务&lt;?php /** *ThisfileispartofLunanShopTeam. *http://code.cent123.com/ *@authorhttp://code.cent123.com/view/387 */ namespaceApp\Jobs; useException; useIlluminate\B