Back-End

22 mai, 2018

Adicionando dados relacionados na API resource do Laravel

Publicidade

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.