A API resource do Laravel facilitou bastante a comunicação RESTfull com outras plataformas. Como explicado no último artigo, onde iniciei sobre este tema, este recurso cria uma camada de transformação dos dados para trabalhar com JSON. Agora, vou dar foco no relacionamento de dados, que não foi contemplado no último artigo.
Relacionamentos com API resource
Sempre que quisermos adicionar recursos relacionados de uma tabela, podemos retornar estes dados fazendo uma requisição no outro resource relacionado. Vamos ao nosso exemplo. Tenho a tabela product_line que possui diversos produtos. Para eu retornar todos os dados deste product_line e todos os produtos que pertencem a ele, basta eu adicionar a Collection de products em um atributo ‘products’ dentro do array.
<?php class ProductLineResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'description' => $this->description, 'products' => ProductResource::collection($this->products), 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, ]; } }
Aqui, se o seu relacionamento está certinho na model, a consulta já vai buscar os produtos relacionados a está linha de produtos. E retornar uma collection dentro do atributo ‘products’.
Exibição condicional
Além de trazer os relacionamentos, também é possível ter o controle da resposta trazendo o dado relacionado apenas se ele já tiver sido carregado na model. Através da função whenLoaded, podemos carregar apenas o relacionamento que queremos através do nome deste relacionamento. Assim, evita-se que sejam carregados relacionamentos desnecessários para o resource.
Agora, vamos ao exemplo. Abaixo, vamos trocar o relacionamento do $this->products para a função $this->whenLoaded(‘products’) para controlar o carregamento deste relacionamento
<?php class ProductLineResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'description' => $this->description, 'products' => ProductResource::collection($this->whenLoaded('products')), 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, ]; } }
No exemplo abaixo, se não for possível carregar o relacionamento do products, o item será removido do resource.
Conclusão
Não existem segredos para a utilização dos relacionamentos dentro do API resource. Na verdade, todo o trabalho está por trás no Eloquent e na Model. Estando tudo certo por trás, relacionar na API resource fica extremamente simples e natural. Para quem quiser se aprofundar mais nesta funcionalidade, aconselho darem uma lida na documentação oficial.