在Laravel中嵌套api资源时如何避免无限循环?

时间:2018-10-24 01:45:53

标签: laravel laravel-5

我有两个模型:CompanyRepresentative。代表属于公司,公司有很多代表。

我还有两个相应的资源。

公司资源

public function toArray($request)
    {
        return [
            'id'          => $this->id,
            'title'       => $this->title,   
            'representatives' => RepresentativeResource::collection($this->representatives)
        ];
    } 

代表资源

 public function toArray($request)
    {
        return [
            'id' => $this->id,
            'company' => $this->company ? new CompanyResource($this->company) : null
        ];
    }

我想要实现的是,当我拥有公司时,我希望得到他们的代表。当我获得代表时,我想获取有关公司的信息。

发生的是无限循环:它们无限地相互包含。

那么,如何解决?

1 个答案:

答案 0 :(得分:1)

您尝试使用whenLoaded吗? here已记录在案,我认为它符合您的需求。

使用您的代码,您应该具有以下内容:

class CompanyResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'title' => $this->title,   
            'representatives' => RepresentativeResource::collection($this->whenLoaded('representatives'))
        ];
    } 
}

class RepresentativeResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'company' => new CompanyResource($this->whenLoaded('company'))
        ];
    } 
}

然后,您必须在控制器中加载与模型的关系。

new RepresentativeResource(Representative::with('company')->first());