Passo 1: Habilitando o Relacionamento
Primeiro, você precisa informar ao controller como os modelos de mestre e detalhe se conectam. Isso é feito com três propriedades:$detailModel: a classe do modelo de detalhe.$detailForeignKey: a chave estrangeira no modelo de detalhe que aponta para o mestre.$detailProperty: o nome do campo no JSON que conterá a lista de detalhes.
Com isso, a funcionalidade é ativada. Internamente, o métodoVeja abaixo um exemplo de registro (com detalhe) que foi retornado em uma resposta de requisição GET:hasDetails()passa a retornartrue, e o controller começa a procurar pelos dados dos detalhes nas requisições.
Passo 2: Personalizando os Detalhes
Agora que o controller conhece o relacionamento, você pode definir como os detalhes devem ser validados e formatados na resposta.$requiredDetailFields: Garante que campos essenciais dos detalhes sejam enviados (em requisições POST ou PUT).$detailIndexFields: Seleciona e renomeia os campos que aparecerão na resposta JSON de cada item.addDetailTransformer(): Aplica formatação customizada (ex: moedas, datas) aos campos dos detalhes.
Observação: perceba que, como o campoVeja um exemplo de requisição GET para um pedido com detalhes:valorfoi renomeado emdetailIndexFieldsparapreco_unit, é esse o nome utilizado emaddDetailTransformer.
Passo 3: A Mágica em Ação (Requisição e Resposta)
Com tudo configurado, você pode criar um pedido e seus itens com uma única requisiçãoPOST.
Exemplo de requisição POST /api/pedido-venda:
GET para este recurso seria assim, já com os campos renomeados e formatados:
produto_id. Com nossa configuração de requiredDetailFields feita anteriormente, esta seria a resposta:
Por Baixo dos Panos…
Para os curiosos, o controller gerencia todo o processo através de um conjunto de métodos internos:saveDetails(): Chamado nostoreeupdatepara salvar os detalhes enviados na requisição.loadDetails(): Chamado nos métodosindex,show,storeeupdatepara carregar os detalhes que serão retornados na resposta JSON.prepareDetailForResponse(): Formata cada item de detalhe antes de incluí-lo na resposta final, aplicando as regras de$detailIndexFieldsedetailTransformers.
Deletando Detalhes de um Mestre
Por fim, oApiResourceController oferece o método deleteDetails($master) para excluir todos os registros de detalhe vinculados a um registro mestre.