Как избежать бесконечного цикла при вложении ресурсов api в Laravel?

У меня две модели: 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
        ];
    }

Чего я хочу добиться, так это когда я получаю компании, я хочу иметь их представителей. Когда я получаю представителя, я хочу получить информацию о компании.

Происходит бесконечный цикл: они включают друг друга бесконечно.

Итак, как это исправить?

Сначала вам нужно определить бизнес-логику. Какие данные вам нужны и зачем? Затем идет код

Paras 24.10.2018 04:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
1
1 399
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы пробовали использовать 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());

Большое спасибо. Единственное, чего я не мог понять, это то, что если я извлекаю компанию, она возвращает ее представителей, и каждый представитель содержит компанию (даже если я загружаю компании в свой контроллер, используя -> with ('members'), а не -> with ( 'members.company')). Таким образом, я получаю много данных, которые не используются (поскольку я уже знаю, с какой компанией я работаю)

Victor 24.10.2018 14:46

Потребовалось время, чтобы найти этот вопрос и ответ, но это была именно наша проблема и решение. Спасибо!

Ken Stuart 29.09.2021 22:19

Другие вопросы по теме