laravel订单列表模糊搜索及关联数据api

一、订单列表模糊搜索及关联数据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已经关联了商品的信息,可以通过如下操作获取相对应的商品详情数据:
在这里插入图片描述
可以看到这边的商品的详情数据已经回来了。我们在给前端提供接口的时候,尽量提供一个就能使用比较完整的接口。

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你华还是你华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值