这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战
一、订单列表模糊搜索及关联数据api
1.1 创建订单模型迁移文件
运行命令创建订单模型以及迁移文件:
php artisan make:model Order -m
1.2 订单表字段
Schema::create('orders', function (Blueprint $table) {
$table->id();
$table->integer('user_id')->comment('下单的用户');
$table->integer('order_no')->comment('订单号');
$table->integer('amount')->comment('总金额,单位分');
$table->tinyInteger('status')->default(1)->comment('订单状态:1=>下单,2=>支付,3=>发货,4=>收获');
$table->integer('address_id')->comment('收获地址');
$table->string('express_type')->comment('快递类型:SF,YT,YD');
$table->string('express_no')->comment('快递单号');
$table->timestamp('pay_time')->nullable()->comment('支付时间');
$table->string('pay_time')->nullable()->comment('支付类型:支付宝,微信');
$table->string('trade_no')->nullable()->comment('支付单号:支付宝,微信');
$table->timestamps();
});
1.3 订单从表
再创建一个从表和模型,记录这个订单包含多产品的一些信息:
运行命令:php artisan make:model OrderDetails -m
1.4 订单从表字段
Schema::create('order_details', function (Blueprint $table) {
$table->id();
$table->integer('order_id')->comment('所属订单');
$table->integer('goods_id')->comment('商品');
$table->integer('price')->comment('商品价格');
$table->integer('num')->comment('商品数量');
$table->timestamps();
});
执行迁移命令:
php artisan migrate
1.5 订单路由创建
/**
* 订单管理
*/
// 订单列表
$api->get('orders', [OrderController::class, 'index']);
// 订单详情
$api->get('orders/{order}', [OrderController::class, 'show']);
// 订单发货
$api->patch('orders/{order}/post', [OrderController::class, 'post']);
手动添加订单一些数据(这些数据是用户端那边产生的,这部分还没写,我们暂时先手动写一些数据测试):
添加订单详情数据:
1.6 创建订单及订单细节transform
1、创建订单OrderTransformer.php:
<?php
namespace App\Transformers;
use App\Models\Order;
use League\Fractal\TransformerAbstract;
class OrderTransformer extends TransformerAbstract {
public function transform(Order $order) {
return [
'id' => $order->id,
'order_no' => $order->order_no,
'user_id' => $order->user_id,
'amount' => $order->amount,
'status' => $order->status,
'address_id' => $order->address_id,
'express_type' => $order->express_type,
'express_no' => $order->express_no,
'pay_time' => $order->pay_time,
'pay_type' => $order->pay_type,
'trade_no' => $order->trade_no,
'created_at' => $order->created_at,
'updated_at' => $order->updated_at,
];
}
}
2、创建订单细节OrderDetailsTransformer.php:
<?php
namespace App\Transformers;
use App\Models\OrderDetails;
use League\Fractal\TransformerAbstract;
class OrderDetailsTransformer extends TransformerAbstract {
protected $availableIncludes = ['goods'];
public function transform(OrderDetails $orderdetails) {
return [
'id' => $orderdetails->id,
'order_id' => $orderdetails->order_id,
'goods_id' => $orderdetails->goods_id,
'price' => $orderdetails->price,
'num' => $orderdetails->num,
'created_at' => $orderdetails->created_at,
'updated_at' => $orderdetails->updated_at,
];
}
/**
* 额外订单
*/
public function includeGoods(OrderDetails $orderdetails) {
return $this->item($orderdetails->goods, new GoodTransformer());
}
}
1.7 订单控制器
运行命令:php artisan make:controller Admin/OrderController
写入列表控制器方法,如下代码:
/**
* 订单列表
*/
public function index(Request $request) {
// 查询条件
$order_no = $request->input('order_no'); // 通过订单号
$trade_no = $request->input('trade_no'); // 通过交易单号
$status = $request->input('status'); // 通过状态
$orders = Order::when($order_no, function ($query) use($order_no) {
$query->where('order_no', 'like', "%$order_no%");
})
->when($trade_no, function ($query) use($trade_no) {
$query->where('trade_no', 'like', "%$trade_no%");
})
->when($status, function ($query) use($status) {
$query->where('status', $status);
})
->paginate();
return $this->response->paginator($orders, new OrderTransformer());
}
1.8 优化
找到订单模型,写入关联用户和细节的方法:
/**
* 所属用户
*/
public function user() {
return $this->belongsTo(User::class, 'user_id', 'id');
}
/**
* 订单拥有的订单细节
*/
public function orderDetails() {
return $this->hasMany(OrderDetails::class, 'order_id', 'id');
}
找到订单细节模型,写入关联订单和产品的方法:
/**
* 所属订单表
*/
public function order() {
return $this->belongsTo(Order::class, 'order_id', 'id');
}
/**
* 所关联的商品
*/
public function goods() {
return $this->hasOne(Good::class, 'id', 'goods_id');
}
给OrderTransformer.php
定义受保护的$availableIncludes
和方法,让外部可以引用:
protected $availableIncludes = ['user', 'orderDetails'];
/**
* 用户数据
*/
public function includeUser(Order $order) {
return $this->item($order->user, new UserTransformer());
}
/**
* 细节数据
*/
public function includeOrderDetails(Order $order) {
return $this->collection($order->orderDetails, new OrderDetailsTransformer());
}
1.9 测试
可以看到模糊搜索以及传入
include
就可以去到相对应的值。
可以看到这边订单的详情的商品都是只有
id
,没有一些商品的相关信息,如果用这个商品的id
再去查这个商品的详情,那么这个做法将是很low
的。但是我们在写订单详情的OrderDetailsTransformer.php
已经关联了商品的信息,可以通过如下操作获取相对应的商品详情数据:
可以看到这边的商品的详情数据已经回来了。我们在给前端提供接口的时候,尽量提供一个就能使用比较完整的接口。
二、订单详情api
1.1 订单详情控制器方法
/**
* 订单详情
*/
public function show(Order $order) {
return $this->response->item($order, new OrderTransformer());
}
1.2 测试效果:
都可以额外的拿到一些相关联的数据。
三、发货api
2.1 发货控制器方法
/**
* 订单发货
*/
public function post(Request $request, Order $order) {
// 验证提交的参数
$request->validate([
'express_type' => 'required|in:SF,YT,YD',
'express_no' => 'required',
],[
'express_type.required' => '快递类型必填',
'express_type.in' => '快递类型只能是顺丰,圆通,韵达',
'express_no.required' => '快递单号必填'
]);
$order->express_type = $request->input('express_type');
$order->express_no = $request->input('express_no');
$order->status = 3; // 发货状态
$order->save();
return $this->response->noContent();
}
这边要记住发货成功后要更改状态为发货状态。
2.2 测试效果
在学习的php的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。
在学习的php的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。