Doctrine ORM

A simple introduction to

Andy Truong

9th Feb 2015

 

TWITTER:  thehongtt

Why

ORM?

Why ORM?

  1. Web application is: Process data

  2. Clean code = Data processing in right method.

  3. SQL is complex

  4. Model relationship is complex

  5. Business logic is complex

Why
Doctrine
ORM?

Inspired by Java Hibernate

Lightweight/Fast

Good community

  1. Built by top influencers

  2. Well supported ZF/SF

  3. Great docs

Battery included

  1. Doctrine Query Language

  2. Event dispatching

  3. Cache

  4. Plugins…

Entity

<?php

/**
 * @Entity
 */
class Person {
  /** @Id @Column(type="integer") */
  private $id;

  /** @Column(type="string") */
  private $name;

  public function setName($name) { $this->name = $name; }

  public function getName() { return $this->name; }
}

Relationship: One to one

<?php

/** @Entity */
class Person {
  /** @OneToOne(targetEntity="Position") */
  private $position;
}

/** @Entity */
class Position {
  /** @Column(type="float") */
  private $x;
  
  /** @Column(type="float") */
  private $y;
}

Relationship: OneToMany

<?php

/** @Entity */
class Person {
  /** @OneToMany(targetEntity="Address", mappedBy="owner") */
  private $addresses;
}

/** @Entity */
class Address {
  /** @Column(type="float") */
  private $x;

  /** @Column(type="float") */
  private $y;

  /** @ManyToOne(targetEntity="Person", inversedBy="addresses") */
  private $owner;
}

Relationship: ManyToMany

<?php

/** @Entity */
class Person {
  /**
   * @ManyToMany(targetEntity="Country")
   * @JoinTable(name="person_nationality")
   */
  private $nationalities;
}

/** @Entity */
class Country {
  /** @Column(type="string") */
  private $name;
}

Entity Manager

function demoCreate(EntityManager $em) {
  $chi = new Person();
  $chi->setName('Chí Văn Phèo');

  $em->persit($chi);
  $em->flush();
}

Entity Manager

function demoUpdate(EntityManager $em, Person $chi) {
  $chi->setName('Chí Phèo');
  $em->persit($chi);
  $chi->flush();
}

Entity Manager

function demoFind(EntityManager $em) {
  // Person or null
  $em->find('Person', 1);
  $em->findOneBy(['name' => 'Chí Phèo']);
  $em->findOneByName('Chí Phèo');
}

Entity Manager

function demoDelete(EntityManager $em, Person $chi) {
  $em->remove($chi);
  $em->flush();
}

Repository (design pattern)

  1. Duplication by Data Handling

  2. Duplication by Data Retrieval Logic Reimplementation

  3. Duplication by Data Persistence Logic Reimplementation

 

Doctrine Query Language

DQL

<?php

$dql = 'SELECT p FROM Person p WHERE p.name = :name';

$query = $em->createQuery($dql);
$query->setParameter('name', 'Chí Phèo');
$ppl = $query->getResult(); // Person[]

DQL

/* Select entity fields */
SELECT p.name FROM Person p WHERE p.name = :name

/* Join */
SELECT p, c 
FROM Person p JOIN p.country c 
WHERE c.name = 'Viet Nam'

/* Sub query */
SELECT p.name FROM Person p WHERE EXISTS (
    SELECT phone.phonenumber 
    FROM Phonenumber phone 
    WHERE phone.person = p.id
)

Thank you

Doctrine ORM

By Andy Truong

Doctrine ORM

  • 1,450