Oi Ismael, tudo bom?
Por padrão todo relacionamento *ToMany
será carregado de forma Lazy, ou seja não buscará automaticamente a informação do relacionamento. Neste caso, se você quiser buscar somente as categorias, nenhum produto será buscado.
Agora, se você tiver uma lista com todas as categorias e tentar buscar os produtos dela, aí todos os produtos serão carregados e acontecerá exatamente o que você comentou, poderá ter problemas de performance e de n+1 queries.
No curso é feito o inverso, a partir de um produto queremos as categorias dele, por isso que todas as categorias de todos os produtos são buscados. Os relacionamentos *ToOne
são Eager por padrão.
É possível mudar o tipo de busca de um relacionamento passando a opção fetch
para a anotação de mapeamento do relacionamento. Exemplo:
/**
* @ManyToOne(targetEntity="Produto\Entity\Categoria", inversedBy = “produto”, fetch="EAGER")
*/
ou então:
/**
* @ManyToOne(targetEntity="Produto\Entity\Categoria", inversedBy = “produto”, fetch="LAZY")
*/
O Doctrine ainda tem uma feature que permite que você faça algumas operações em relacionamentos *ToMany
sem carregar a coleção inteira chamada Extra Lazy. Para habilitar esta feature, é só mapear:
/**
* @ManyToMany(targetEntity="Produto\Entity\Categoria", inversedBy = “produto”, fetch="EXTRA_LAZY")
*/
As operações que não carregam toda a coleção de elementos é comentada aqui.
Abraço e desculpa a demora para responder a sua pergunta!