IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> Laravel学习- 订单表-商品表-创建订单-事务的处理 -> 正文阅读

[PHP知识库]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 接下来 要用到计划任务, 处理订单失效的功能
    ....
}

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-10-18 17:08:51  更:2021-10-18 17:11:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 14:06:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计