Laravel API报Attempt to read property "id" on string错误排查咨询
错误原因
- 你完全误用了Laravel JsonResource的结构:
toArray方法的入参$request是HTTP请求实例,$request->all()返回的是你接口传入的所有请求参数(比如你调用接口传的limit=5、offset=0都是字符串类型的参数值),你循环请求参数自然拿到的都是字符串,尝试读取字符串的id属性就会触发当前报错。 - 你传进
ProductResource的是Product::get()返回的模型集合,但单个JsonResource默认是处理单条模型数据的,你用错了资源的使用方式。 JsonResource的toArray方法只需要返回格式化后的数组即可,不需要手动返回response()实例,Laravel会自动将返回的数组转为JSON响应。
修复方案
方案1(官方推荐写法,最规范)
- 首先修改
ProductResource.php,只处理单条产品数据的格式化:
class ProductResource extends JsonResource { public function toArray($request) { return [ 'id' => "p" . $this->id, 'name' => $this->name, 'slug' => $this->slug, 'regular_price' => $this->regular_price, 'sale_price' => $this->sale_price, 'SKU' => $this->SKU, 'stock_status' => $this->stock_status, 'quantity' => "p" . $this->quantity, 'image' => $this->url, 'images' => $this->url, 'category_id' => $this->category_id, ]; } }
- 然后修改
ProductController.php中返回资源的代码,用collection方法处理集合:
把两处return new ProductResource($products);改成return ProductResource::collection($products);即可。
方案2(非规范写法,可快速修复)
直接修改ProductResource.php的toArray方法,循环你传入的集合即可(注意你传入的集合存在$this->resource属性里,不是$request里):
class ProductResource extends JsonResource { public function toArray($request) { $responses = []; foreach ($this->resource as $product) { $responses[] = [ 'id' => "p" . $product->id, 'name' => $product->name, 'slug' => $product->slug, 'regular_price' => $product->regular_price, 'sale_price' => $product->sale_price, 'SKU' => $product->SKU, 'stock_status' => $product->stock_status, 'quantity' => "p" . $product->quantity, 'image' => $product->url, 'images' => $product->url, 'category_id' => $product->category_id, ]; } return $responses; } }
内容的提问来源于stack exchange,提问作者May Yadanar Tun
相关产品推荐
相关产品推荐

