Laravel学习- 订单表-商品表-创建订单-事务的处理

创建商品表goods

$table->bigIncrements('id');
$table->integer('user_id', false)->comment('创建者id');
$table->integer('category_id', false)->comment('分类id');
$table->string('title',200)->comment('商品标题');
$table->integer('price', false)->comment('价格');
$table->string('norms',100)->comment('规格');
$table->integer('stork', false)->comment('库存');
$table->integer('num', false)->default(1)->comment('数量');
$table->string('descript',255)->nullable()->comment('备注');

创建订单表orders

$table->bigIncrements('id');
$table->integer('user_id')->comment('购买者用户id');
$table->integer('order_id')->comment('订单id');
$table->integer('amount')->comment('金额');
$table->integer('status')->comment('状态: 1下单, 2支付, 3发货, ');
$table->integer('address_id')->comment('地址');
$table->string('express_type')->comment('快递类型: SF, YT, YD');
$table->string('express_no',255)->comment('快递单号');
$table->timestamp('pay_time')->comment('支付时间');
$table->string('pay_type', 10)->comment('支付类型: alipay, wechat');
$table->string('trade_no', 255)->comment('交易单号');
$table->timestamps();

创建订单详情表order_details

$table->bigIncrements('id');
$table->integer('order_id')->comment('所属订单');
$table->integer('goods_id')->comment('商品id');
$table->integer('price')->comment('价格');
$table->integer('num')->comment('商品数量');
$table->timestamps();

自己目前处理学习laravel中, 可能有些地方不对, 要是有错误的地方, 比如支付的时候逻辑的处理可以分享与我, 自己刚接触没有支付经验, 如有分享 万分感谢 


1. 订单预览

// 预览订单
public function preview()
{
	// TODO 暂时模拟的地址
	$address = [
		['id' => 1, 'address' => '北京']
	];
	// 获取购物车的数据
	$carts = Cart::where('user_id', auth()->user()->id)
					->where('is_checked', 1) //选中的
					->with('goods:id,title,cover') //关联商品表,只显示id,title,cover是三个字段
					->get();
	return response()->json(['code' => 200, 'data' => $carts]);
}

2. 订单创建

public function post(Request $request)
{
	$request->validate([
		'address_id'    => 'required'
	]);

	// 处理插入数据
	$user_id = auth()->user()->id;
	// 订单号 自己生成
	$order_no = date('YmdHis').rand(100000, 999999);
	// 计算购物车总价
	$amount = 0;

	// 定义要插入订单详情的数据
	$insertData = [];

	$carts = Cart::where('user_id', auth()->user()->id)
		->where('is_checked', 1) //选中的
		->with('goods:id,title,cover, stock') //关联商品表,只显示id,title,cover是三个字段
		->get();

	foreach ($carts as $key => $val) {
		// 如果有商品库存不足, 提示用户重新选择
		if ($val->goods->stock < $val->num) {
			return response()->json(['code' => 500]);
		}
		// 这里不应该在这里写, 应该在加入购物车控制器里写
		// 加入购物车那里也要判断商品库存不足问题 && 加入购物车时重复商品 数量要++
		// 判断购物车数据是否存在
		$cart = Cart::where('user_id', auth()->user()->id)
				->where('goods_id', $request->input('goods_id'))
				->first();
		if (!empty($cart)) {
			$cart->num = $request->input('num', 1);
			$cart->save();
		}



		$insertData[] = [
			'good_id' => $val->goods->id,
			'price' => $val->goods->price,
			'num' => $val->num
		];
		$amount += $val->goods->price * $val->num;
	}

	try {
		DB::beginTransaction();
		// 生成订单
		Order::create([
			'user_id' => auth()->user()->id,
			'user_no' => $order_no,
			'address_id' => $request->input('address_id'),
			'amount' => $amount
		]);

		// 生成订单的详情; 这里要往订单详情里插入数据的话, 需要一个order_id字段, 因为订单模型里面 关联了订单细节的模型, 会自把关联的字段填充到数组里
		// Order->orderDetails() 就会建立构造器
		$order->orderDetails()->createMany($insertData);

		// 删除已经结算的购物车数据
		Cart::where('user_id', auth()->user()->id)
			->where('is_checked', 1) //选中的
			->delete();

		// 减去商品对应的库存量
		foreach ($carts as $val) {
			Good::where('id', $val->goods_id)->decrement('stork', $val->num);
		}

		DB::commit();

		return response()->json(['code' =>200]);
	} catch (\Exception $e) {
		DB::rollback();
		throw $e;
	}

    // TODO 接下来 要用到计划任务, 处理订单失效的功能
    ....
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值