一、订单详情管理
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()
{
$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'
], [
'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的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。
|