Doctrine ORM
-
Upload
rafael-mello -
Category
Software
-
view
62 -
download
0
Transcript of Doctrine ORM
Doctrine ORM
Rafael Mello ([email protected])
ndice
O que Doctrine ORM
Como funciona o ORM
Principais annotations
Manipulao de dados
Repositrios
Precaues
Vantagens
Desvantagens
O que Doctrine ORM
O Doctrine ORM, inspirado nos padres do JPA e no Hibernate do Java, das principais libraries PHP de implementao do padro ORM.
Como funciona o ORM
No ORM, entidades representam tabelas e atributos representam seus campos.
Como funciona o ORM
Relacionamento entre tabelas podem ser representados em seus atributos.
Principais annotations
@EntityDefine que a classe representa uma entidade.Exemplo:
/** * @ORM\Entity */class Product
{}
Principais annotations
@TableDefine que a classe de entidade representa uma tabela.Exemplo:
/** * @ORM\Entity * @ORM\Table(name="product") */class
Product
{}
Principais annotations
@ColumnDefine que o atributo da entidade corresponde a um campo.Exemplo:
/** * @ORM\Column(type="string") */private $name;
Principais annotations
@IdDefine que o atributo da entidade corresponde a uma chave primaria.Exemplo:
/** * @ORM\Column(type="integer") * @ORM\Id */private $id;
Principais annotations
@GeneratedValueEspecifica estratgia de como o valor da chave primria ser gerado.Exemplo:
/** * @ORM\Column(type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */private $id;
Principais annotations
@OneToManyDefine que o campo uma relao de um para muitos.Exemplo:
/** * @ORM\OneToMany(targetEntity="Product", mappedBy="category") */private $products;
public function __construct(){ $this->products = new ArrayCollection();}
Principais annotations
@ManyToOneDefine que o campo uma relao de muitos para um.Exemplo:
/** * @ORM\ManyToOne(targetEntity="Category", inversedBy="products") */private $category;
Principais annotations
@OneToOneDefine que o campo uma relao de um para um.Exemplo:
/** * @ORM\OneToOne(targetEntity="Category", inversedBy="products") */private $category;
Manipulao de dados
As buscas podero ser feitas utilizando a linguagem DQL(Doctrine Query Language), inspira no HQL do Hibernate.
Manipulao de dados
Exemplo:
// Busca por DQL$result = $em ->createQuery(SELECT p FROM Product p) ->getResult();
// Busca por repositrio$result = $em->getRepository(Product)->findAll();
A consulta retornar objetos da entidade Product.
Manipulao de dados
Exemplo:
$result = $em->createQuery(SELECT p.name, p.price, c.name as
category_name FROM Product p JOIN p.category c)
->setParameter(nome_categoria, bebida) ->getResult();
A consulta retornar um array com nome do produto, preo do produto e nome da categoria.
Manipulao de dados
Para inserir um dado ou atualiz-lo, dever ser utilizado o objeto de entidade.
Exemplo de insero:$category = new Category();$category->setName(bebida);$em->persist($category);$em->flush();
Exemplo de atualizao:$category = $em->getRepository(Category)->find(1);$category->setName(bebida);$em->flush();
Manipulao de dados
Para excluir um dado, dever ser utilizado o objeto de entidade.
Exemplo:$category = $em->getRepository(Category)->find(1);$em->remove($category);$em->flush();
Repositrios
Um repositrio uma classe onde vinculada a uma entidade e possui mtodos para realizar buscas.
Por padro, todas as entidades possuem repositrios, mesmo que voc no os crie.
Repositrios
Boas prticas:
Sempre crie os repositrios de todas as entidades, independente
se possuir mtodos ou no;
Por definio da equipe do Doctrine, repositrios devero possuir apenas mtodos que realizem buscas.
Repositrios
Exemplo de repositrio
class ProductRepository extends EntityRepository{ public function buscaProdutosPorCategoria($nomeCategoria) { return $em->createQuery(SELECT p FROM Products p JOIN p.category c WHERE c.name = :nome_categoria) ->setParameter(nome_categoria, $nomeCategoria) ->getResult(); }}
Repositrios
Exemplo de entidade vinculada a um repositrio
/** * @ORM\Entity(repositoryClass=ProductRepository) *
@ORM\Table(name="product") */class Product
{}
Precaues
Consulta de dados onde retornam entidades poder buscar campos nos quais muitas vezes no sero utilizados.
Precaues
Consultar relacionamentos por LAZY pode causar perda de desempenho, principalmente se a mesma estiver dentro de um foreach.
Exemplo de consulta por LAZY:$categoryName = $product->getCategory()->getName();
Precaues
Precaues
A cada consulta ou insero, o Doctrine armazena a entidade em memria. Sempre que realizar procedimentos onde trabalhe com muitas entidades, tire da memria as quais no sero mais utilizadas.
Exemplo//Remove da memria somente a entidade armazenada na
varivel
$em->detach($product);
//Remove todas as entidades da memria
$em->clear();
Vantagens
Maior independncia ao banco de dados;
Fcil estruturao sem se preocupar com sintaxes de SQL nativas do SGBD;
A camada de modelo representa a estrutura de seu banco de dados.
Desvantagens
Por se tratar de uma camada intermediaria entre o sistema e o banco de dados, uma m implementao poder causar queda de performance.