DoctrineSiga a doutrina certa
Fabio B. Silva :github.com/FabioBatSilva / [email protected] / @FabioBatSilva
Quem é esse cara ai ?• Fabio B. Silva
• Desenvolvedor php
• Desenvolvedor java
• Doctrine core developer
• @FabioBatSilva
• github.com/FabioBatSilva
• Alcoolatra nas horas vagas
AGENDA
ORM● Baseado no JPA (Hibernate / EJB / Nhibernate)● Construído sobre componentes● Data Mapper● Objetos Simples● DQL● Otimizado● Performance
Classe Simples
EntityManagerPonte central de acesso as funcionalidades do ORM
EntityManagerPonte central de acesso as funcionalidades do ORM
EntityManagerPonte central de acesso as funcionalidades do ORM
Relacionamentos
● OneToOne● ManyToOne● OneToMany● ManyToMany
RelacionamentosOneToOne
RelacionamentosManyToOne
RelacionamentosOneToMany
RelacionamentosManyToMany
Fetch Mode
● EAGER● LAZY (default)● EXTRA_LAZY
Fetch ModeEAGER
Relacionamento é carregado junto com a entidade
Fetch ModeLAZY
Carrega o relacionamento apenas quando é invocado
Fetch ModeEXTRA_LAZY
Carrega o relacionamento apenas quando um elemento é invocado
Cascade Operations
● persist● remove● merge● detach● all
Operações executadas nos relacionamentos
Herança
● Concrete Table Inheritance● Single Table Inheritance● Class Table Inheritance
Herança
Uma classe em uma tabela
● Concrete Table Inheritance● Single Table Inheritance● Class Table Inheritance
HerançaConcrete table inheritance
HerançaConcrete table inheritance
Herança
Várias classes em uma mesma tabela
● Concrete Table Inheritance● Single Table Inheritance● Class Table Inheritance
HerançaSingle table inheritance
HerançaSingle table inheritance
Herança
Várias classes em várias tabelas
● Concrete Table Inheritance● Single Table Inheritance● Class Table Inheritance
HerançaClass table inheritance
HerançaClass table inheritance
DQLDoctrine Query Language
● DQL : Doctrine Query Language● Usa Classes e propriedades invés de tabelas e colunas● Normalmente retorna uma lista de entidades● Parseado para SQL nativa● Cross database
DQL
Perguntas ?
ORMs não tem boa performance ...● São lentos● Complicados de usar● Complicados de configurar● Só podem ser usados para coisas simples
ORMs não tem boa performance ...● O problema é cultural● Desenvolvedores usam ORM porque não conhecem SQL e SGBDs● Conheça bancos de dados antes de usar um ORM● ORM não substitui PDO, são construídos sobre ele● A abstração tem um custo● Read the fucking manual
Best Practices.
Best Practices :Não use atributos públicos
Best Practices :Não use caracteres especiais
Best Practices :Atenção no mapeamento dos relacionamentos
Lado inverso apenas realmente quando for usa-lo
Best Practices :Evite chaves compostas
Trabalho extra para resolver o identificador
Best Practices :Evite chaves compostas
Best Practices :Cuidado no uso de eventos
Evento é disparado para todas as entidades persistidas.
Best Practices :Cuidado no uso de eventos
Best Practices :Cuidado no uso de eventos
version_compare(DOCTRINE_VERSION, '2.4-DEV', '>=')
Best Practices :Query builder
WTF ???
Best Practices :Query builder
Best Practices :Get reference
Carrega a entidade apenas para persistir
Best Practices :Get reference
Best Practices :Repository
Evite lógica no Controller
Best Practices :Repository
Best Practices :Fetch join association
Três consultas executadas
Best Practices :Fetch join association
Best Practices :Partial objects
Seleciona todos os atributos da entidade
Best Practices :Partial objects
Best Practices :Named Queries
Best Practices :Named Native Queries
CacheMelhor amigo da performance
● Metadata Cache● Query Cache● Result Cache
CacheMelhor amigo da performance
● Metadata Cache● Query Cache● Result Cache
Cache dos mapeamentos das entidades
CacheMelhor amigo da performance
● Metadata Cache● Query Cache● Result Cache
Cache dos parser de DQL para SQL nativa
CacheMelhor amigo da performance
● Metadata Cache● Query Cache● Result Cache
Cache dos resultados de consultas
DoctrineSiga a doutrina certa
Perguntas ???
Fabio B. Silva :github.com/FabioBatSilva / [email protected] / @FabioBatSilva
Top Related