这是我参与8月更文挑战的第29天,活动详情查看:8月更文挑战
一、商品添加api优化
1.1 添加之前检查分类
/**
* 添加商品
*/
public function store(GoodsRequest $request)
{
// 对分类进行检查,是否存在,只能使用3级分类,并且分类不能被禁用
$category = Category::find($request -> category_id);
if (!$category) return $this->response->errorBadRequest('分类不存在!');
if ($category->status == 0) return $this->response->errorBadRequest('分类被禁用!');
if ($category->level != 3) return $this->response->errorBadRequest('只能向3级分类添加商品!');
$user_id = auth('api')->id();
$request->offsetSet('user_id', $user_id);
Good::create($request->all());
return $this->response->created();
}
效果:
1.2 商品表加字段
我们发现在商品表中,商品名称字段忘记加了,我们有两种方法进行添加:
1、回滚重新执行迁移 (在项目初期使用) 2、加一个增加迁移文件的表(如果数据表里已有许多数据,建议采用这种修改)
我们这边选择第一种,因为第二种之前演示过了。
执行回滚命令 php artisan migrate:rollback
回滚上一次的迁移。
接着在迁移文件中将商品名称字段加上:
$table->string('title')->comment('商品名称');
然后重新执行迁移命令:
php artisan migrate
修改表单验证:
接着修改商品模型:
1.3 测试效果
二、商品列表api
2.1 创建商品Transformer
在Transformers
下直接复制一个GoodTransformer.php
<?php
namespace App\Transformers;
use App\Models\Category;
use App\Models\Good;
use League\Fractal\TransformerAbstract;
class GoodTransformer extends TransformerAbstract {
protected $availableIncludes = ['category']; // 配置可用的关联
public function transform(Good $good) {
return [
'id' => $good->id,
'title' => $good->title,
'category_id' => $good->category_id,
// 'category_name' => Category::find($good->category_id) -> name, // 处理好分类名称
'description' => $good->description,
'price' => $good->price,
'stock' => $good->stock,
'cover' => $good->cover,
'pics' => $good->pics,
'details' => $good->details,
'is_on' => $good->is_on,
'is_recommend' => $good->is_recommend,
'created_at' => $good->created_at,
'updated_at' => $good->updated_at,
];
}
public function includeCategory(Good $good) {
return $this->item($good->category, new CategoryTransformer()); // 关联分类
}
}
2.2 关联分类数据
在Transformers
创建CategoryTransformer.php
,写入代码:
<?php
namespace App\Transformers;
use App\Models\Category;
use League\Fractal\TransformerAbstract;
class CategoryTransformer extends TransformerAbstract {
public function transform(Category $category) {
return [
'id' => $category->id,
'name' => $category->name,
];
}
}
测试获取到关联分类的数据:
这里
include
字段就是你这命名的小写:
2.3 关联用户数据
这边做关联用户数据目的是为了知道这个商品是哪个用户创建的。
在GoodTransformer.php
增加:
同时在
Good.php
模型下增加:
效果:
2.4 优化列表搜索
/**
* 商品列表
*/
public function index(Request $request)
{
$title = $request->query('title'); // 传了商品名称的情况
$category_id = $request->query('category_id'); // 传了商品id
$is_on = $request->query('is_on', false); // 是否上架的状态 上架、下架。 不传的时候给默认值false
$is_recommend = $request->query('is_recommend', false); // 是否推荐的状态 推荐、不推荐。 不传的时候给默认值false
$goods = Good::when($title, function ($query) use ($title) {
$query->where('title', 'like', "%$title%"); // 双引号写变量,%模糊搜索
})
->when($category_id, function ($query) use ($category_id) {
$query->where('title', $category_id); // id的话直接等于
})
->when($is_on !== false, function ($query) use ($is_on) {
$query->where('is_on', $is_on);
})
->when($is_recommend !== false, function ($query) use ($is_recommend) {
$query->where('is_recommend', $is_recommend);
})
->paginate(2);
return $this->response->paginator($goods, new GoodTransformer());
}
解释都写到代码里去了。
2.5 测试效果
在学习的php的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。