我已经创建了一个API资源:
Or
在控制器中,我从模型class OrderResource extends JsonResource
{
public function toArray($request)
{
return [
"id" => $this->Id,
"photo" => ''
];
}
}
获取数据,并将数据放入资源OrderModel
:
OrderResource
因此,我尝试像这样在public function show($id)
{
$order = OrderModel::with('OrderPhoto')->findOrFail(1);
return new OrderResource($order);
}
中使用关系OrderPhoto
:
OrderResource
但是它不起作用,并出现此错误:
未定义的属性:Illuminate \ Database \ Query \ Builder :: $ map
我做了public function toArray($request)
{
return [
"id" => $this->Id,
"photo" => OrderPhotoResource::collection($this->whenLoaded('OrderPhoto')),
];
}
的资源和获得的信息:
集体订购照片:
dd($this)
答案 0 :(得分:1)
在您的OrderResource
中尝试一下:
use OrderPhoto as OrderPhotoResource;
//
public function toArray($request)
{
return [
"id" => $this->Id,
"photo" => new OrderPhotoResource($this->whenLoaded('OrderPhoto')),
];
}
如您所见,您已经将OrderPhoto
定义为资源集合:
class OrderPhoto extends ResourceCollection // <-- note the extended class
因此,在这种情况下,您需要使用此类实例化该类并传递集合,而不是使用静态方法collection
。
为单个对象定义API资源时,如下所示:
php artisan make:resource PostResource
您可以按如下方式使用它:
$post = Post::find(1);
return new PostResource($post);
如果您要使用 API资源来格式化一组资源而不是单个资源,则需要执行以下操作:
$posts = Post::all();
return PostResource::collection($posts); // <-- note the ::collection part
如果您希望完全控制响应中返回的元数据,请定义一个自定义的 API资源集合类。
将类生成为集合(在末尾添加“集合”或使用标志--collection
):
php artisan make:resource PostResourceCollection
然后,在对其进行自定义之后:
$posts = Post::all();
return new PostResourceCollection($posts); // <-- instantiating the class