Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Carregar registro sem os "filhos"

No exemplo do curso, supondo que a categoria seria o registro pai e os produtos seriam os registros filhos, seria possivel buscar a listagem das categorias sem trazer os produtos das categorias?

To imaginando uma loja com 10 categorias e um milhao de produtos, pelo que vi ate agora, se eu listar a categorias, indiretamente estarei pesquisando os produtos de cada categoria, e com isso eu teria problemas de performance.

3 respostas

Serio que ninguem vai responder?

Serio mesmo?

solução!

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!