doctrine
TRANSCRIPT
http://www.doctrine-project.org/jueves, 26 de septiembre de 13
¿Qué es Doctrine?
jueves, 26 de septiembre de 13
¿Qué es Doctrine?
• DBAL (Database abstraction layer)
• ORM (Object Relational Mapper)
jueves, 26 de septiembre de 13
¿Qué significa DBAL?
jueves, 26 de septiembre de 13
Database Abstraction Layer
jueves, 26 de septiembre de 13
DBAL
“Powerful database abstraction layer with many features for database schema introspection, schema management and
PDO abstraction”
jueves, 26 de septiembre de 13
DBAL
<?php
use Doctrine\DBAL\Configuration;use Doctrine\DBAL\DriverManager;
$config = new Configuration();//..$connectionParams = array( 'dbname' => 'mydb', 'user' => 'user', 'password' => 'secret', 'host' => 'localhost', 'driver' => 'pdo_mysql',);$conn = DriverManager::getConnection($connectionParams, $config);
Crear conexión
jueves, 26 de septiembre de 13
DBAL
<?php
// ...
$conn = DriverManager::getConnection($connectionParams, $config);$stmt = $conn->query('SELECT * FROM users');
while ($row = $stmt->fetch()) { echo $row['name'], PHP_EOL;}
Ejecutar consulta
jueves, 26 de septiembre de 13
DBAL
<?php
// ...
$conn = DriverManager::getConnection($connectionParams, $config);$stmt = $conn->prepare('SELECT * FROM users WHERE name = ? AND age = ?');
$stmt->bindValue(1, $name);$stmt->bindValue(2, $age);$stmt->execute();
Ejecutar consulta con parámetros
jueves, 26 de septiembre de 13
DBAL
<?php
// ...
$conn = DriverManager::getConnection($connectionParams, $config);$stmt = $conn->prepare('SELECT * FROM users WHERE id = :id');
$stmt->bindValue(':id', $id);$stmt->execute();
Ejecutar consulta con parámetros con nombre
jueves, 26 de septiembre de 13
DBAL
<?php
// ...
$conn = DriverManager::getConnection($connectionParams, $config);$stmt = $conn->prepare('SELECT * FROM users WHERE created > :created');
$stmt->bindValue(':created', $created, 'datetime');$stmt->execute();
Ejecutar consulta con parámetros indicando typo de dato
jueves, 26 de septiembre de 13
¿Qué es un ORM?
jueves, 26 de septiembre de 13
Object-Relational Mapping
jueves, 26 de septiembre de 13
"Es una técnica de programación para convertir datos entre el sistema de tipos utilizado en un lenguaje de programación orientado a objetos y la utilización de una base de datos relacional, utilizando un motor de
persistencia. En la práctica esto crea una base de datos orientada a objetos virtual, sobre la base de
datos relacional."
http://es.wikipedia.org/wiki/Mapeo_objeto-relacionaljueves, 26 de septiembre de 13
ORM
• Transforma datos de la DB a objetos PHP
jueves, 26 de septiembre de 13
ORM
• Transforma datos de la DB a objetos PHP
• Y de PHP a la DB
jueves, 26 de septiembre de 13
ORM
• Transforma datos de la DB a objetos PHP
• Y de PHP a la DB
• Transforma las relaciones entre dos tablas
jueves, 26 de septiembre de 13
ORM
• Transforma datos de la DB a objetos PHP
• Y de PHP a la DB
• Transforma las relaciones entre dos tablas
• Simplifica la transformación entre tipos de datos
jueves, 26 de septiembre de 13
ORM
• Transforma datos de la DB a objetos PHP
• Y de PHP a la DB
• Transforma las relaciones entre dos tablas
• Simplifica la transformación entre tipos de datos
• Data Mapper
jueves, 26 de septiembre de 13
ORM
¿Qué nos soluciona?
jueves, 26 de septiembre de 13
ORM¿Qué nos soluciona?
• Podemos utilizar orientación a objetos
jueves, 26 de septiembre de 13
ORM¿Qué nos soluciona?
• Podemos utilizar orientación a objetos
• Evita tener SQL en todos lados
jueves, 26 de septiembre de 13
ORM¿Qué nos soluciona?
• Podemos utilizar orientación a objetos
• Evita tener SQL en todos lados
• Simplifica el entendimiento del código
jueves, 26 de septiembre de 13
ORM¿Qué nos soluciona?
• Podemos utilizar orientación a objetos
• Evita tener SQL en todos lados
• Simplifica el entendimiento del código
• Facilita el proceso de migración
jueves, 26 de septiembre de 13
ORM¿Qué nos soluciona?
• Podemos utilizar orientación a objetos
• Evita tener SQL en todos lados
• Simplifica el entendimiento del código
• Facilita el proceso de migración
• SQL Injection
jueves, 26 de septiembre de 13
ORM
¿Problemas?
jueves, 26 de septiembre de 13
ORM¿Problemas?
• Agrega overhead
• Puede ejecutar SQL no óptimo(si no se utiliza adecuadamente)
• No siempre es la mejor solución
jueves, 26 de septiembre de 13
ORM
EntityManager
jueves, 26 de septiembre de 13
ORMEntityManager
• Responsable de gestionar la persistencia y obtención de entidades
jueves, 26 de septiembre de 13
ORMEntityManager
• Responsable de gestionar la persistencia y obtención de entidades
• Uno por conexión
jueves, 26 de septiembre de 13
ORMEntityManager
• Responsable de gestionar la persistencia y obtención de entidades
• Uno por conexión
• Utiliza el patrón UnitOfWork para optimizar la gestión de muchas entidades
jueves, 26 de septiembre de 13
ORMEntityManager
<?php
use Doctrine\ORM\EntityManager;use Doctrine\ORM\Tools\Setup;
$paths = array("/path/to/entity-files");$isDevMode = false;
// Configuracion para entidades que utilizan annotations$config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode);
// Obtengo el EntityManager$entityManager = EntityManager::create($connection, $config);
jueves, 26 de septiembre de 13
ORMEntityManager
<?php
// ...
// Parametros de conexión$connectionParams = array( 'dbname' => 'mydb', 'user' => 'user', 'password' => 'secret', 'host' => 'localhost', 'driver' => 'pdo_mysql',);
// Obtengo el EntityManager$entityManager = EntityManager::create($connectionParams, $config);
jueves, 26 de septiembre de 13
ORMEntity Manager
// Indica al EntityManager que se// debe persistir la entidad en la db$entityManager->persist($entity);
persist()
jueves, 26 de septiembre de 13
ORMEntity Manager
// Escribe los cambios en la base de datos$entityManager->flush();
flush()
jueves, 26 de septiembre de 13
ORM
Entidades
jueves, 26 de septiembre de 13
ORMEntidades
• Objetos PHP
jueves, 26 de septiembre de 13
ORMEntidades
• Objetos PHP
• Representan a una tabla en la BD
jueves, 26 de septiembre de 13
ORMEntidades
• Objetos PHP
• Representan a una tabla en la BD
• Una instancia representa a una fila en la tabla
jueves, 26 de septiembre de 13
ORMEntidades
• Objetos PHP
• Representan a una tabla en la BD
• Una instancia representa a una fila en la tabla
• Se pueden heredar
jueves, 26 de septiembre de 13
ORMEntidades
<?php
class User{ private $id; private $name;
public function getId() { return $this->id; }
public function getName() { return $this->name; }
public function setName($name) { $this->name = $name; }}
$a = new User();$a->setName("Ismael");
jueves, 26 de septiembre de 13
ORMEntidades
<?php
/** @Entity */class User{ /** * @Id * @Column(type="integer") * @GeneratedValue(strategy="AUTO") */ private $id;
/** * @Column(type="string") */ private $name;}
jueves, 26 de septiembre de 13
ORMEntidades
$user = new User();$user->setName("Ismael");
$entityManager->persist($user);$entityManager->flush();
echo $user->getId();
1.Instanciación2.Hidratación3.Persistencia4.Escritura
jueves, 26 de septiembre de 13
ORM
Relaciones entre entidades
jueves, 26 de septiembre de 13
ORMRelaciones entre entidades
•OneToOne
•OneToMany•ManyToOne
•ManyToMany
jueves, 26 de septiembre de 13
ORMRelaciones entre entidades
<?php
/** @Entity */class User{ /** * @Id * @Column(type="integer") * @GeneratedValue(strategy="AUTO") */ private $id;
/** * @Column(type="string") */ private $name;
/** * @OneToMany( * targetEntity="PhoneNumber", * mappedBy="user", * cascade={“persist”, “remove”} * ) */ private $phoneNumbers;}
<?php
/** @Entity */class PhoneNumber{ /** * @Id * @Column(type="integer") * @GeneratedValue(strategy="AUTO") */ private $id;
/** * @Column(type="string") */ private $phone;
/** * @ManyToOne( * targetEntity="User", * inversedBy="phoneNumbers" * ) */ private $user;}
jueves, 26 de septiembre de 13
ORMRelaciones entre entidades
// Crea una instancia de PhoneNumber$phoneNumber = new PhoneNumber();$phoneNumber->setPhone("555-1234");
$user = new User();$user->setName("Ismael");
// Asocia el phone number al usuario$user->addPhoneNumber($phoneNumber);
// Guarda ambas entidades$entityManager->persist($user);$entityManager->flush();
foreach ($user->getPhoneNumbers() as $phoneNumber) { echo $phoneNumber->getPhone(), PHP_EOL;}
jueves, 26 de septiembre de 13
ORM
Repositorios
jueves, 26 de septiembre de 13
ORMRepositorios
• Nos da acceso a los datos
jueves, 26 de septiembre de 13
ORMRepositorios
• Nos da acceso a los datos
• Independiente de como se persisten los datos
jueves, 26 de septiembre de 13
ORMRepositorios
• Nos da acceso a los datos
• Independiente de como se persisten los datos
• Existe uno por entidad
jueves, 26 de septiembre de 13
ORMRepositorios
• Nos da acceso a los datos
• Independiente de como se persisten los datos
• Existe uno por entidad
• Puedo crear mis propios repositorios
jueves, 26 de septiembre de 13
ORMRepositorios
<?php
interface ObjectRepository{ public function find($id);
public function findAll();
public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null);
public function findOneBy(array $criteria);}
jueves, 26 de septiembre de 13
ORMRepositorios
<?php
// Retorna el repositorio para la entidad Namespace\User$repository = $entityManager->getRepository('Namespace\User');
// Obtengo el objeto con ID = 1$user = $repository->find(1);
echo $user->getName();
find()
jueves, 26 de septiembre de 13
ORMRepositorios
<?php
// Retorna el repositorio para la entitdad Namespace\User$repository = $entityManager->getRepository('Namespace\User');
// Obtengo un array de objetos User$user = $repository->findAll();
foreach ($users as $user) { echo $user->getName();}
findAll()
jueves, 26 de septiembre de 13
ORMRepositorios
<?php
// Retorna el repositorio para la entitdad Namespace\User$repository = $entityManager->getRepository('Namespace\User');
// Obtengo un array de objetos User donde status = enabled$user = $repository->findBy(array('status' => 'enabled'));
foreach ($users as $user) { echo $user->getName();}
findBy()
jueves, 26 de septiembre de 13
ORMRepositorios
<?php
// Retorna el repositorio para la entitdad Namespace\User$repository = $entityManager->getRepository('Namespace\User');
// Obtengo el primer objeto User donde status = enabled$user = $repository->findOneBy(array('status' => 'enabled'));
echo $user->getName();
findOneBy()
jueves, 26 de septiembre de 13
ResumenDBAL
Capa de abstracción para la interacción con nuestra bases de datos
ORM
Herramienta que nos permite traducir objetos PHP en registros de la base de datos y viceversa
jueves, 26 de septiembre de 13
¿Preguntas?
jueves, 26 de septiembre de 13
¡Gracias!
jueves, 26 de septiembre de 13