项目需求,需要购物车中需要下单生产订单号,将产品保存到数据库中。实现代码如下:
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]);
}