这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战
一、购物车管理api
1.1 创建购物车模型和迁移文件
运行命令php artisan make:model Cart -m
创建购物车模型和迁移文件: 创建表字段:
Schema::create('carts', function (Blueprint $table) {
$table->id();
$table->integer('user_id')->comment('用户');
$table->integer('goods_id')->comment('商品');
$table->integer('num')->default(1)->comment('商品数量');
$table->integer('is_checked')->default(1)->comment('是否选择:0=>不选,1=>选中');
$table->timestamps();
});
复制代码
运行迁移命令:php artisan migrate
购物车模型设置购物车允许批量赋值的字段:
// 允许批量赋值的字段
protected $fillable = ['user_id', 'goods_id', 'num'];
复制代码
1.2 创建购物车资源控制器
运行命令php artisan make:controller Web/CartController --api
:
1、写入加入购物车添加方法
/**
* 加入购物
*/
public function store(Request $request)
{
$request->validate([
'goods_id' => 'required|exists:goods,id',
'num' => [
// 数量不能超过商品的库存
function ($attribute, $value, $fail) use ($request) {
$goods = Good::find($request->goods_id);
if ($value > $goods->stock) {
$fail("数量不能超过商品库存!");
}
}
]
], [
'goods_id.required' => '商品不能为空',
'goods_id.exists' => '商品不存在'
]);
// 查询购物车数据是否存在
$cart = Cart::where('user_id', auth('api') -> id())
->where('goods_id', $request->input('goods_id'))
->first();
if (!empty($cart)) {
$cart->num = $cart->num + $request->input('num',1);
$cart->save();
return $this->response->noContent();
}
Cart::create([
'user_id' => auth('api')->id(),
'goods_id' =>$request->input('goods_id'),
'num' => $request->input('num', 1)
]);
return $this->response->created();
}
复制代码
2、数量增加减少方法
在购物车模型处增加模型关联商品:
/**
* 所关联的商品
*/
public function goods() {
return $this->belongsTo(Good::class, 'goods_id', 'id');
}
复制代码
/**
* 更新数量
*/
public function update(Request $request, Cart $cart)
{
$request->validate([
'num' => [
'required',
'gte:1', //要大于等于1
function ($attribute, $value, $fail) use ($cart) {
if ($value > $cart->goods->stock) { // 用关联模型去取商品模型
$fail('数量不能超过最大库存!');
}
}, // 还不能超过库存
]
], [
'num.required' => '数量不能为空',
'num.gte' => '数量至少大于1',
]);
$cart->num = $request->input('num');
$cart->save();
return $this->response->noContent();
}
复制代码
3、移除购物车
/**
* 移除购物车
*/
public function destroy(Cart $cart)
{
$cart->delete();
return $this->response->noContent();
}
复制代码
4、购物车列表
购物车列表是需要额外的商品的数据,所以我们创建购物车的CartTransformer.php
:
<?php
namespace App\Transformers;
use App\Models\Cart;
use League\Fractal\TransformerAbstract;
class CartTransformer extends TransformerAbstract {
// 额外引入的数据
protected $availableIncludes = ['goods'];
public function transform(Cart $cart) {
return [
'id' => $cart->id,
'user_id' => $cart->user_id,
'goods_id' => $cart->goods_id,
'num' => $cart->num,
'is_checked' => $cart->is_checked,
];
}
/**
* 额外的商品数据
*/
public function includeGoods (Cart $cart) {
return $this->item($cart->goods, new GoodTransformer());
}
}
复制代码
购物车列表方法:
/**
* 购物车商品列表
*/
public function index()
{
$carts = Cart::where('user_id', auth('api')->id())->get(); // 当前用户购物车列表
return $this->response->collection($carts, new CartTransformer());
}
复制代码
1.3 创建购物车资源路由
/**
* 购物车
*/
$api->resource('carts', CartController::class, [
'except' => ['show'] // 排除购物车详情 不需要
]);
复制代码
1.4 测试效果
1、测试加入购物车:
2、测试更新数量 可以看到更新成功。
3、删除购物车
4、购物车列表 可以看到商品的额外信息都读取到了。
在学习的php的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。