DEV Community

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

Posted on • Edited 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

Image of Datadog

Master Mobile Monitoring for iOS Apps

Monitor your app’s health with real-time insights into crash-free rates, start times, and more. Optimize performance and prevent user churn by addressing critical issues like app hangs, and ANRs. Learn how to keep your iOS app running smoothly across all devices by downloading this eBook.

Get The eBook

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay