如何在API资源中使用条件关系?

时间:2018-11-18 22:16:37

标签: php laravel laravel-5

我已经创建了一个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')), ]; } 的资源和获得的信息:

enter image description here

集体订购照片:

dd($this)

1 个答案:

答案 0 :(得分:1)

TL; DR

在您的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