Doctrine ORM

download Doctrine ORM

If you can't read please download the document

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.