创建商品表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 接下来 要用到计划任务, 处理订单失效的功能
....
}
|