O que diabé Doctrine?

Alessandro Feitoza

  • Fullstack Developer na Darkmira
  • Professor de Dev. Web na iwtraining
  • Fundador da PHP com Rapadura
  • Co-organizador do Darkmira Tour PHP

(Fortaleza-CE)

Doctrine 

Biblioteca PHP com serviços de persistência e mapeamento

www.doctrine-project.org

Quem usa? 

DBAL
ORM

DBAL 

  • Serviços básicos: Insert, Select, Update, Delete
  • Transactions
  • É praticamente um PDO muito melhorado.

Database Abstraction Layer

ORM 

Object Relational Mapper

  • Mapeamento de Entidades
  • DQL
  • Chega de criar as tabelas
  • no PHPmyAdmin

Porque usar? 

  • Aumento de Produtividade
  • Bom design de software
  • extrai ao máximo o poder dos objetos
  • Aumento de Produtividade

Quando não usar? 

  • Quando não quiser
  • Quando não souber OO

Suporte a quais bancos

  • MySQL
  • PostgreSQL
  • Oracle
  • SQL Server

Como faz?

Baixando

composer require doctrine/orm

 

Estruturando

Conexão

/config/database.php

Conexão

/src/Adapter/Connection.php

Console

/config/cli-config.php

Entidades

/src/Entity/User.php

Colunas

/**
 * @Id()
 * @Column(type="integer")
 * @GeneratedValue()
 */
private $id;

/**
 * @Column(name="name", length=100, nullable=true)
 */
private $name;

/**
 * @Column(unique=true, type="string")
 */
private $email;

Tá, mas e aí?

Console


php vendor/bin/doctrine orm:schema-tools:update

Relacionamentos

HasLifecycleCallbacks

/**
 * @Column(type="datetime")
 */
private $registered;

/**
 * @Column(type="datetime", nullable=true)
 */
private $updated;
/**
 * @PrePersist()
 */
public function prePersist()
{
    $this->registered = new \DateTime();
}

/**
 * @PreUpdate()
 */
public function preUpdate()
{
    $this->updated = new \DateTime();
}

HasLifecycleCallbacks

Mas e pra salvar os dados?

Não manjo de SQL

2 coisas

$entityManager = Connection::getEntityManager();
$repository = $entityManager->getRepository(User::class);

Find / Select

$this->repository->findAll();
$this->repository->findBy(['status' => true]);
$this->repository->find('1');
$this->reposutory->findOneBy(['email' => 'a@a']);
  • SELECT * FROM TABLE;
  • SELECT * FROM TABLE WHERE colx='valx';
  • SELECT * FROM TABLE WHERE colx='valx' LIMIT 1;

Persist / Insert

public function insert(User $user): void
{
    $this->entityManager->persist($user);
    $this->entityManager->flush();
}

INSERT INTO TABLE (col1, col2)

VALUES ('val1', 'val2');

 Update

public function update(User $user): void
{
    $this->entityManager->persist($user);
    $this->entityManager->flush();
}

UPDATE TABLE
SET col1='val1', col2='val2'

WHERE colx='valx';

 

Delete

public function remove(User $user): void
{
    $this->entityManager->remove($user);
    $this->entityManager->flush();
}

DELETE FROM TABLE WHERE colx='valx';

QueryBuilder

public function findWithProjection(array $fields): array
{
    $queryBuilder = $this
    	->entityManager
        ->createQueryBuilder(User::class);

    return $queryBuilder
        ->select($fields) // ['name', 'email']
        ->getQuery()
        ->execute();
}

SELECT name, email FROM TABLE;

E agora?

Q faço eu da vida sem vc?

Dúvidas?

Valeu o Boi!

Valeu Vaqueiro.

@feitozaAle

@alessandro_feitoza

https://github.com/iwtraining/helpdesk

@alessandrofeitoza

O que diabé Doctrine?

By Alessandro Feitoza

O que diabé Doctrine?

Slides da aula de Doctrine

  • 100
Loading comments...

More from Alessandro Feitoza