如何在API的Product模型show方法响应中返回similarProductsBasedOnBrand结果
解决方案:将相似品牌产品加入API响应
步骤1:修正相似产品方法(可选但建议)
你的similarProductsBasedOnBrand方法命名指向品牌逻辑,但内部使用了Category::find($brand_id),这大概率是笔误。如果你的品牌数据存在Brand模型中,建议修正方法逻辑,避免业务混淆:
public function similarProductsBasedOnBrand($brand_id) { // 若确实是基于Category查询则保留原代码,否则替换为Brand模型 return Brand::find($brand_id)->products()->get(); }
步骤2:将相似产品加入API响应
在show方法中,先通过当前产品获取品牌ID,调用相似产品方法后,用ProductResource::collection()将集合转为统一的API资源格式,最后添加到additional响应数组中:
修改后的show方法代码:
public function show(Product $product): ProductResource { // 获取当前产品的品牌ID(假设Product模型有brand_id字段) $brandId = $product->brand_id; // 获取相似品牌产品并转为资源集合 $similarProducts = ProductResource::collection( $product->similarProductsBasedOnBrand($brandId) ); return (new ProductResource($product))->additional([ 'gallery' => $product->photos->pluck('image') ->transform(fn ($v) => Storage::disk('public')->url($v)), 'similar_products' => $similarProducts ]); }
额外优化:排除当前产品
如果希望相似产品列表不包含当前产品,可以在similarProductsBasedOnBrand方法中添加过滤条件:
public function similarProductsBasedOnBrand($brand_id) { return Brand::find($brand_id)->products() ->where('id', '!=', $this->id) // 排除当前产品 ->get(); }
内容的提问来源于stack exchange,提问作者Pouya Vaghefi
相关产品推荐
相关产品推荐

