php购物车下单逻辑

项目需求,需要购物车中需要下单生产订单号,将产品保存到数据库中。实现代码如下:

public function doCart(){
        // 获取用户输入
        $remark = $this->request->request('remark', ''); // 备注
        $addr = $this->request->request('addr', '');    // 地址

        // 数据验证
        if (empty($addr)) {
            $this->error('收货地址不能为空');
        }

        // 获取当前用户ID
        $userId = $this->auth->id;

        // 查询购物车数据
        $cartItems = Db::name('cart')->where('u_id', $userId)->select();
        if (empty($cartItems)) {
            $this->error('购物车为空,无法下单');
        }

        // 计算总金额
        $totalPrice = 0;
        foreach ($cartItems as $item) {
            $totalPrice += $item['amount'] * $item['market_price'];
        }

        // 生成订单号
        $orderNumber = $this->generateOrderNumber();
        // 主订单数据
        $orderData = [
            'orderno'      => $orderNumber,
            'u_id'         => $userId,
            'total_price'  => $totalPrice,
            'remark'       => $remark,
            'addr'         => $addr,
            'createtime'   => time(),
        ];

        // 子订单数据
        $orderItems = [];
        foreach ($cartItems as $item) {
            $orderItems[] = [
                'orderno'      => $orderNumber,
                'product_id'   => $item['product_id'],
                'market_price' => $item['market_price'],
                'amount'       => $item['amount'],
            ];
        }
        // 开启事务
        Db::startTrans();
        try {
            // 插入主订单
            Db::name('order')->insert($orderData);

            // 批量插入子订单
            Db::name('order_item')->insertAll($orderItems);

            // 清空购物车
            Db::name('cart')->where('u_id', $userId)->delete();

            // 提交事务
            Db::commit();
        } catch (\Exception $e) {
            // 回滚事务
            Db::rollback();
            $this->error('下单失败,请稍后重试');
        }

        // 返回成功信息
        $this->success('下单成功', ['orderno' => $orderNumber]);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值