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 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> laravel的创建订单以及订单详情管理 -> 正文阅读

[游戏开发]laravel的创建订单以及订单详情管理

一、订单详情管理

1.1 创建订单控制器

运行命令php artisan make:controller Web/OrderController创建订单控制器:
在这里插入图片描述
写入订单详情以及订单提交方法:

<?php

namespace App\Http\Controllers\Web;

use App\Http\Controllers\BaseController;
use App\Models\Cart;
use App\Models\Order;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class OrderController extends BaseController
{
    /**
     * 预览订单
     */
    public function preview()
    {
        // 地址数据
        // TODO 暂时模拟地址数据
        $address = [
            ['id' => 1, 'name' => '张三', 'address' => '厦门', 'phone' => '123123'],
            ['id' => 2, 'name' => '李四', 'address' => '厦门', 'phone' => '123123'],
            ['id' => 3, 'name' => '王武', 'address' => '厦门', 'phone' => '123123'],
        ];

        // 购物车数据
        $carts = Cart::where('user_id', auth('api')->id())
            ->where('is_checked', 1)
            ->with('goods:id,cove,title')
            ->get();

        // 返回数据
        return $this->response->array([
            'address' => $address,
            'carts' => $carts,
        ]);
    }

    /**
     * 提交订单
     */
    public function store(Request $request)
    {
        // 验证地址字段
        $request->validate([
            'address_id' => 'required' // TODO 地址要存在才行 exists:address,id
        ], [
            'address_id.required' => ['收获地址不能为空']
        ]);

        // 处理插入的数据
        $user_id = auth('api')->id();
        $order_no = date('YmdHis') . rand(100000, 999999);
        $amount = 0;
        $cartsQuery = Cart::where('user_id', $user_id)
            ->where('is_checked', 1);

        $carts = $cartsQuery->with('goods:id,price')->get();

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


        foreach ($carts as $key => $cart) {
            $insertData[] = [
                'goods_id' => $cart->goods_id,
                'price' => $cart->goods->price,
                'num' => $cart->num
            ];
            $amount += $cart->goods->price * $cart->num;
        }

        try {
            DB::beginTransaction(); // 开启事务
            // 生成订单
            $order = Order::create([
                'user_id' => $user_id,
                'order_no' => $order_no,
                'address_id' => $request->input('address_id'),
                'amount' => $amount
            ]);

            // 生成订单的详情
            $order->orderDetails()->createMany($insertData);

            // 删除已经结算的购物车数据
            $cartsQuery->delete();
            DB::commit(); // 没有异常才提交
            return $this->response->created();
        } catch (\Exception $e) {
            DB::rollBack(); // 出现异常 事务 数据回滚
            throw $e; // 抛出异常
        }
    }
}

在这里插入图片描述

1、我们这边暂时还没做地址管理api,所以地址暂时用模拟
2、由于创建订单涉及到多表操作,万一一步操作错了,可能会产生未知的bug,所以我们这边使用事务来进行异常捕获并抛出。

由于往订单表中插入数据,所以我们还要往订单表中写入可批量赋值的字段:
在这里插入图片描述
由于也往订单详情表中插入了数据,所以也需要往订单详情表中插入可批量的字段:
在这里插入图片描述


1.2 创建订单路由

        /**
         * 订单
         */
        // 订单预览页
        $api->get('order/preview', [OrderController::class, 'preview']);

        // 提交订单
        $api->post('order', [OrderController::class, 'store']);

在这里插入图片描述


1.3 测试效果

在这里插入图片描述

测试的时候我们发现报错了,原因是我们之前在建订单表时,将订单单号设置成了integer在这里插入图片描述
所以我们来修改下这个字段的类型。
首先运行命令composer require doctrine/dbal
在这里插入图片描述
接着运行:php artisan make:migration modify_order_no_column_in_orders_table --table=orders创建修改该字段的迁移文件:
在这里插入图片描述
接着写入:$table->string('order_no')->comment('订单单号')->change();
在这里插入图片描述
好的类型就修改好了。


接下来测试:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到生成了订单,并且购物车中数据也没了。

在学习的php的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-09-14 13:41:42  更:2021-09-14 13:42:30 
 
开发: 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年5日历 -2024/5/17 9:49:23-

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