Sim, o `loadMissing` pode ser usado com relacionamentos aninhados em Laravel, mas há algumas nuances a serem cientes.
O que é `loadMissing`?
O método `loadMissing` no Laravel Eloquent é usado para ansiar por relações de carga apenas se ainda não foram carregadas na instância do modelo. Isso ajuda a evitar consultas redundantes, verificando se os dados do relacionamento já estão presentes antes de consultar o banco de dados novamente [6].
Usando `loadmissing` com relacionamentos aninhados
- Você pode especificar relacionamentos aninhados na notação de pontos com o `loadMissing`, como` 'Author.Contacts', para carregar um relacionamento aninhado apenas se estiver faltando [7].
- No entanto, existe um comportamento conhecido em que, se você "carregar" uma relação aninhada de uma relação que já está carregada, o Laravel poderá recarregar a própria relação dos pais. Por exemplo, se você já carregou 'inscrições' em um modelo, chamando `loadMissing ('inscrições.nestedRelation') fará com que a relação 'inscrições` recarregue completamente [1].
- Isso significa que, embora o `loadMissing` suporta relações aninhadas, ele pode desencadear recarregar as relações intermediárias se elas foram carregadas anteriormente, mas sem a relação aninhada.
Considerações práticas
- `loadMissing` é útil quando você deseja que os relacionamentos de carga ansiosa condicionalmente, impedindo consultas duplicadas se a relação já estiver carregada.
- Para relacionamentos aninhados, você deve estar ciente de que o carregamento de uma relação aninhada ausente de uma relação dos pais carregada anteriormente pode causar a relação dos pais com a recarga, o que pode afetar o desempenho.
- Se você deseja evitar tais recargas, pode ser necessário gerenciar cuidadosamente quando e como você carrega relações aninhadas ou considera que os carregam com `com ()`.
Resumo
- Sim, `loadMissing` pode ser usado com relacionamentos aninhados usando a notação de pontos.
- Ele carrega apenas as relações aninhadas, se elas estiverem faltando.
- Mas se a relação dos pais for carregada sem a relação aninhada, `loadMissing` poderá recarregar a relação dos pais para buscar os dados aninhados [1] [6] [7].
Esse comportamento é importante para evitar múltiplas consultas inesperadas ao trabalhar com o carregamento ansioso aninhado em Laravel.
Citações:
[1] https://github.com/laravel/framework/issues/23027
[2] https://stackoverflow.com/questions/62563063/filtering-a-nested-relation-in-graphql
[3] https://compositecode.blog/2023/07/25/graphql-nested-queries-relationships-practices/
[4] https://github.com/fifemon/graphql-datasource/issues/15
[5] https://www.sea-ql.org/sea-orm-cookbook/001-how-to-load -nested-relation.html
[6] https://stackoverflow.com/questions/47238937/laravel-what-is-the-purpose-of-the-loadmissing-função
[7] https://stackoverflow.com/questions/35490728/laravel-eloquent-ager-loading-of-multiple nest-relations/53205641
[8] https://docs.sqlalchemy.org/14/orm/loading_relationships.html
[9] https://www.prisma.io/docs/orm/prisma-client/queries/relation-queries