Как избежать бесконечного цикла при вложении ресурсов API в Laravel? - PullRequest
0 голосов
/ 24 октября 2018

У меня есть две модели: Company и Representative.Представитель принадлежит компании, компания имеет много представителей.

Также у меня есть два соответствующих ресурса.

Ресурс компании :

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 голосов
/ 24 октября 2018

Вы пытались использовать whenLoaded?Это задокументировано здесь , и я думаю, что оно соответствует вашим потребностям.

С вашим кодом у вас должно получиться что-то вроде этого:

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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...