DEV Community

Cover image for Otimizando com Doctrine - find vs getReference
Thiago Luna
Thiago Luna

Posted on • Updated on

Otimizando com Doctrine - find vs getReference

Nesse post quero compartilhar com vocês uma maneira de otimizarmos uma busca utilizando o ORM Doctrine.

find()

Considerando uma aplicação que trabalha com Categoria e Post, se eu tiver que consultar uma determinada Categoria para relacioná-la com Post, posso usar o find() como vemos abaixo:

image

Colocando uma lupa nessa busca, podemos observar o seguinte resultado:

image

Até aqui, tudo certo. O resultado trouxe todos os dados da entidade Categoria desejada (id=1).

O ponto é que para relacionar essa Categoria a um Post, preciso apenas do id dela. Os demais campos, bem como as informações de posts, association, collection e outros são desnecessárias para este caso.

getReference()

O Doctrine nos oferece um outro método chamado getReference().

image
image

Olhando agora para o resultado gerado pelo getReference(), vemos também a entidade Category, porém, tendo apenas o campo id hidratado.

Ou seja, o getReference é bem mais rápido que o find()!

E isso é muito útil em casos onde é preciso ter apenas o id da entidade para realizar uma ação, como por exemplo a deleção, onde não preciso ter no resultado da busca todos os campos da entidade, mas apenas o id.

image

Comparando o tempo de resposta entre o find() e o getReference() em nosso ambiente de desenvolvimento não vamos perceber praticamente diferença alguma.
Contudo, no ambiente de produção, que certamente existem entidades com muito mais campos e relacionamentos e dezenas de centenas e até milhares de registros, essa diferença será significativa.

Com o getReference() o processamento é menor, o uso de memória é menor, o aceso ao banco de dados é muito menor, pois o Doctrine se preocupará em pegar apenas o id.

E isso é crucial para a aplicação que está rodando em produção. Imagine uma página que tem uma quantidade enorme de acessos simultâneos que realiza essa busca...

Outro benefício está no custo. Se a aplicação está hospedada em algum Cloud Service Provider como o GCP, AWS ou Azure, usar menos processamento e memória significa ter uma conta menor no final do mês para pagar.

E assim termino este post. Usei exemplos bem simples para demonstrar o getReference() e o benefício de usá-lo nos casos em que só precisamos ter o id da entidade.

Agora é só por em prática!

Há braços e até o próximo artigo.

Thiago Luna - Linkedin

Top comments (0)