laravel的购物车管理api

这是我参与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的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。

猜你喜欢

转载自juejin.im/post/7033210933312913421