Doctrine ORM

RafaelMello15 201 views 28 slides Oct 28, 2016
Slide 1
Slide 1 of 28
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28

About This Presentation

Uma breve apresentação do Doctrine ORM, projeto open-source pioneiro em implementar o padrão ORM no PHP.


Slide Content

Doctrine ORM
Rafael Mello ([email protected])

Índice
●O que é Doctrine ORM
●Como funciona o ORM
●Principais annotations
●Manipulação de dados
●Repositórios
●Precauções
●Vantagens
●Desvantagens

O que é Doctrine ORM
O Doctrine ORM, inspirado nos padrões do JPA e no
Hibernate do Java, é das principais libraries PHP de
implementação do padrão 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
@Entity
Define que a classe representa uma entidade.
Exemplo:
/**
* @ORM\Entity
*/
class Product
{
}

Principais annotations
@Table
Define que a classe de entidade representa uma tabela.
Exemplo:
/**
* @ORM\Entity
* @ORM\Table(name="product")
*/
class Product
{
}

Principais annotations
@Column
Define que o atributo da entidade corresponde a um campo.
Exemplo:
/**
* @ORM\Column(type="string")
*/
private $name;

Principais annotations
@Id
Define que o atributo da entidade corresponde a uma chave primaria.
Exemplo:
/**
* @ORM\Column(type="integer")
* @ORM\Id
*/
private $id;

Principais annotations
@GeneratedValue
Especifica estratégia de como o valor da chave primária será gerado.
Exemplo:
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

Principais annotations
@OneToMany
Define que o campo é uma relação de um para muitos.
Exemplo:
/**
* @ORM\OneToMany(targetEntity="Product", mappedBy="category")
*/
private $products;
public function __construct()
{
$this->products = new ArrayCollection();
}

Principais annotations
@ManyToOne
Define que o campo é uma relação de muitos para um.
Exemplo:
/**
* @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
*/
private $category;

Principais annotations
@OneToOne
Define que o campo é uma relação de um para um.
Exemplo:
/**
* @ORM\OneToOne(targetEntity="Category", inversedBy="products")
*/
private $category;

Manipulação de dados
As buscas poderão ser feitas utilizando a
linguagem DQL(Doctrine Query Language),
inspira no HQL do Hibernate.

Manipulação de dados
Exemplo:
// Busca por DQL
$result = $em
->createQuery(“SELECT p FROM Product p ”)
->getResult();
// Busca por repositório
$result = $em->getRepository(“Product”)->findAll();
A consulta retornará objetos da entidade “Product”.

Manipulação 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, preço do produto e
nome da categoria.

Manipulação de dados
Para inserir um dado ou atualizá-lo, deverá ser
utilizado o objeto de entidade.
Exemplo de inserção:
$category = new Category();
$category->setName(‘bebida’);
$em->persist($category);
$em->flush();
Exemplo de atualização:
$category = $em->getRepository(“Category”)->find(1);
$category->setName(‘bebida’);
$em->flush();

Manipulação 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();

Repositórios
Um repositório é uma classe onde é vinculada a
uma entidade e possui métodos para realizar
buscas.
Por padrão, todas as entidades possuem
repositórios, mesmo que você não os crie.

Repositórios
Boas práticas:
●Sempre crie os repositórios de todas as
entidades, independente se possuirá métodos
ou não;
●Por definição da equipe do Doctrine, repositórios
deverão possuir apenas métodos que realizem
buscas.

Repositórios
Exemplo de repositório
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();
}
}

Repositórios
Exemplo de entidade vinculada a um repositório
/**
* @ORM\Entity(repositoryClass=”ProductRepository”)
* @ORM\Table(name="product")
*/
class Product
{
}

Precauções
●Consulta de dados onde retornam entidades
poderá buscar campos nos quais muitas vezes
não serão utilizados.

Precauções
●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();

Precauções

Precauções
●A cada consulta ou inserção, o Doctrine
armazena a entidade em memória. Sempre que
realizar procedimentos onde trabalhe com
muitas entidades, tire da memória as quais não
serão mais utilizadas.
Exemplo
//Remove da memória somente a entidade armazenada na variável
$em->detach($product);
//Remove todas as entidades da memória
$em->clear();

Vantagens
●Maior independência ao banco de dados;
●Fácil estruturação 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á
implementação poderá causar queda de
performance.