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 ...
DBAL
<?php
use DoctrineDBALConfiguration;
use DoctrineDBALDriverManager;
$config = new Configuration();
//..
$connectionPa...
DBAL
<?php
// ...
$conn = DriverManager::getConnection($connectionParams, $config);
$stmt = $conn->query('SELECT * FROM us...
DBAL
<?php
// ...
$conn = DriverManager::getConnection($connectionParams, $config);
$stmt = $conn->prepare('SELECT * FROM ...
DBAL
<?php
// ...
$conn = DriverManager::getConnection($connectionParams, $config);
$stmt = $conn->prepare('SELECT * FROM ...
DBAL
<?php
// ...
$conn = DriverManager::getConnection($connectionParams, $config);
$stmt = $conn->prepare('SELECT * FROM ...
¿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 or...
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 d...
ORM
• Transforma datos de la DB a objetos PHP
• Y de PHP a la DB
• Transforma las relaciones entre dos tablas
• Simplifica ...
ORM
• Transforma datos de la DB a objetos PHP
• Y de PHP a la DB
• Transforma las relaciones entre dos tablas
• Simplifica ...
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...
ORM
¿Qué nos soluciona?
• Podemos utilizar orientación a objetos
• Evita tener SQL en todos lados
• Simplifica el entendimi...
ORM
¿Qué nos soluciona?
• Podemos utilizar orientación a objetos
• Evita tener SQL en todos lados
• Simplifica el entendimi...
ORM
¿Qué nos soluciona?
• Podemos utilizar orientación a objetos
• Evita tener SQL en todos lados
• Simplifica el entendimi...
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 ...
ORM
EntityManager
jueves, 26 de septiembre de 13
ORM
EntityManager
• Responsable de gestionar la persistencia y
obtención de entidades
jueves, 26 de septiembre de 13
ORM
EntityManager
• Responsable de gestionar la persistencia y
obtención de entidades
• Uno por conexión
jueves, 26 de sep...
ORM
EntityManager
• Responsable de gestionar la persistencia y
obtención de entidades
• Uno por conexión
• Utiliza el patr...
ORM
EntityManager
<?php
use DoctrineORMEntityManager;
use DoctrineORMToolsSetup;
$paths = array("/path/to/entity-files");
...
ORM
EntityManager
<?php
// ...
// Parametros de conexión
$connectionParams = array(
    'dbname' => 'mydb',
    'user' => ...
ORM
Entity Manager
// Indica al EntityManager que se
// debe persistir la entidad en la db
$entityManager->persist($entity...
ORM
Entity Manager
// Escribe los cambios en la base de datos
$entityManager->flush();
flush()
jueves, 26 de septiembre de ...
ORM
Entidades
jueves, 26 de septiembre de 13
ORM
Entidades
• Objetos PHP
jueves, 26 de septiembre de 13
ORM
Entidades
• Objetos PHP
• Representan a una tabla en la BD
jueves, 26 de septiembre de 13
ORM
Entidades
• Objetos PHP
• Representan a una tabla en la BD
• Una instancia representa a una fila en la tabla
jueves, 26...
ORM
Entidades
• Objetos PHP
• Representan a una tabla en la BD
• Una instancia representa a una fila en la tabla
• Se puede...
ORM
Entidades
<?php
class User
{
private $id;
private $name;
public function getId()
{
return $this->id;
}
public function...
ORM
Entidades
<?php
/** @Entity */
class User
{
    /**
     * @Id
     * @Column(type="integer")
     * @GeneratedValue(s...
ORM
Entidades
$user = new User();
$user->setName("Ismael");
$entityManager->persist($user);
$entityManager->flush();
echo ...
ORM
Relaciones entre entidades
jueves, 26 de septiembre de 13
ORM
Relaciones entre entidades
•OneToOne
•OneToMany
•ManyToOne
•ManyToMany
jueves, 26 de septiembre de 13
ORM
Relaciones entre entidades
<?php
/** @Entity */
class User
{
    /**
     * @Id
     * @Column(type="integer")
     * ...
ORM
Relaciones entre entidades
// Crea una instancia de PhoneNumber
$phoneNumber = new PhoneNumber();
$phoneNumber->setPho...
ORM
Repositorios
jueves, 26 de septiembre de 13
ORM
Repositorios
• Nos da acceso a los datos
jueves, 26 de septiembre de 13
ORM
Repositorios
• Nos da acceso a los datos
• Independiente de como se persisten los
datos
jueves, 26 de septiembre de 13
ORM
Repositorios
• Nos da acceso a los datos
• Independiente de como se persisten los
datos
• Existe uno por entidad
jueve...
ORM
Repositorios
• Nos da acceso a los datos
• Independiente de como se persisten los
datos
• Existe uno por entidad
• Pue...
ORM
Repositorios
<?php
interface ObjectRepository
{
    public function find($id);
    public function findAll();
    publ...
ORM
Repositorios
<?php
// Retorna el repositorio para la entidad NamespaceUser
$repository = $entityManager->getRepository...
ORM
Repositorios
<?php
// Retorna el repositorio para la entitdad NamespaceUser
$repository = $entityManager->getRepositor...
ORM
Repositorios
<?php
// Retorna el repositorio para la entitdad NamespaceUser
$repository = $entityManager->getRepositor...
ORM
Repositorios
<?php
// Retorna el repositorio para la entitdad NamespaceUser
$repository = $entityManager->getRepositor...
Resumen
DBAL
Capa de abstracción para la interacción con
nuestra bases de datos
ORM
Herramienta que nos permite traducir o...
¿Preguntas?
jueves, 26 de septiembre de 13
¡Gracias!
jueves, 26 de septiembre de 13
Upcoming SlideShare
Loading in...5
×

Doctrine

142

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
142
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
9
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Doctrine

  1. 1. http://www.doctrine-project.org/ jueves, 26 de septiembre de 13
  2. 2. ¿Qué es Doctrine? jueves, 26 de septiembre de 13
  3. 3. ¿Qué es Doctrine? •DBAL (Database abstraction layer) •ORM (Object Relational Mapper) jueves, 26 de septiembre de 13
  4. 4. ¿Qué significa DBAL? jueves, 26 de septiembre de 13
  5. 5. Database Abstraction Layer jueves, 26 de septiembre de 13
  6. 6. DBAL “Powerful database abstraction layer with many features for database schema introspection, schema management and PDO abstraction” jueves, 26 de septiembre de 13
  7. 7. DBAL <?php use DoctrineDBALConfiguration; use DoctrineDBALDriverManager; $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
  8. 8. 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
  9. 9. 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
  10. 10. 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
  11. 11. 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
  12. 12. ¿Qué es un ORM? jueves, 26 de septiembre de 13
  13. 13. Object-Relational Mapping jueves, 26 de septiembre de 13
  14. 14. "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-relacional jueves, 26 de septiembre de 13
  15. 15. ORM • Transforma datos de la DB a objetos PHP jueves, 26 de septiembre de 13
  16. 16. ORM • Transforma datos de la DB a objetos PHP • Y de PHP a la DB jueves, 26 de septiembre de 13
  17. 17. 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
  18. 18. 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
  19. 19. 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
  20. 20. ORM ¿Qué nos soluciona? jueves, 26 de septiembre de 13
  21. 21. ORM ¿Qué nos soluciona? • Podemos utilizar orientación a objetos jueves, 26 de septiembre de 13
  22. 22. ORM ¿Qué nos soluciona? • Podemos utilizar orientación a objetos • Evita tener SQL en todos lados jueves, 26 de septiembre de 13
  23. 23. 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
  24. 24. 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
  25. 25. 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
  26. 26. ORM ¿Problemas? jueves, 26 de septiembre de 13
  27. 27. 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
  28. 28. ORM EntityManager jueves, 26 de septiembre de 13
  29. 29. ORM EntityManager • Responsable de gestionar la persistencia y obtención de entidades jueves, 26 de septiembre de 13
  30. 30. ORM EntityManager • Responsable de gestionar la persistencia y obtención de entidades • Uno por conexión jueves, 26 de septiembre de 13
  31. 31. ORM EntityManager • 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
  32. 32. ORM EntityManager <?php use DoctrineORMEntityManager; use DoctrineORMToolsSetup; $paths = array("/path/to/entity-files"); $isDevMode = false; // Configuracion para entidades que utilizan annotations $config = Setup::createAnnotationMetadataConfiguration($paths, $isD evMode); // Obtengo el EntityManager $entityManager = EntityManager::create($connection, $config); jueves, 26 de septiembre de 13
  33. 33. ORM EntityManager <?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
  34. 34. ORM Entity Manager // Indica al EntityManager que se // debe persistir la entidad en la db $entityManager->persist($entity); persist() jueves, 26 de septiembre de 13
  35. 35. ORM Entity Manager // Escribe los cambios en la base de datos $entityManager->flush(); flush() jueves, 26 de septiembre de 13
  36. 36. ORM Entidades jueves, 26 de septiembre de 13
  37. 37. ORM Entidades • Objetos PHP jueves, 26 de septiembre de 13
  38. 38. ORM Entidades • Objetos PHP • Representan a una tabla en la BD jueves, 26 de septiembre de 13
  39. 39. ORM Entidades • Objetos PHP • Representan a una tabla en la BD • Una instancia representa a una fila en la tabla jueves, 26 de septiembre de 13
  40. 40. ORM Entidades • 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
  41. 41. ORM Entidades <?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
  42. 42. ORM Entidades <?php /** @Entity */ class User {     /**      * @Id      * @Column(type="integer")      * @GeneratedValue(strategy="AUTO")      */     private $id;     /**      * @Column(type="string")      */     private $name; } jueves, 26 de septiembre de 13
  43. 43. ORM Entidades $user = new User(); $user->setName("Ismael"); $entityManager->persist($user); $entityManager->flush(); echo $user->getId(); 1.Instanciación 2.Hidratación 3.Persistencia 4.Escritura jueves, 26 de septiembre de 13
  44. 44. ORM Relaciones entre entidades jueves, 26 de septiembre de 13
  45. 45. ORM Relaciones entre entidades •OneToOne •OneToMany •ManyToOne •ManyToMany jueves, 26 de septiembre de 13
  46. 46. ORM Relaciones 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
  47. 47. ORM Relaciones 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
  48. 48. ORM Repositorios jueves, 26 de septiembre de 13
  49. 49. ORM Repositorios • Nos da acceso a los datos jueves, 26 de septiembre de 13
  50. 50. ORM Repositorios • Nos da acceso a los datos • Independiente de como se persisten los datos jueves, 26 de septiembre de 13
  51. 51. ORM Repositorios • Nos da acceso a los datos • Independiente de como se persisten los datos • Existe uno por entidad jueves, 26 de septiembre de 13
  52. 52. ORM Repositorios • 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
  53. 53. ORM Repositorios <?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
  54. 54. ORM Repositorios <?php // Retorna el repositorio para la entidad NamespaceUser $repository = $entityManager->getRepository('NamespaceUser'); // Obtengo el objeto con ID = 1 $user = $repository->find(1); echo $user->getName(); find() jueves, 26 de septiembre de 13
  55. 55. ORM Repositorios <?php // Retorna el repositorio para la entitdad NamespaceUser $repository = $entityManager->getRepository('NamespaceUser'); // Obtengo un array de objetos User $user = $repository->findAll(); foreach ($users as $user) {     echo $user->getName(); } findAll() jueves, 26 de septiembre de 13
  56. 56. ORM Repositorios <?php // Retorna el repositorio para la entitdad NamespaceUser $repository = $entityManager->getRepository('NamespaceUser'); // 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
  57. 57. ORM Repositorios <?php // Retorna el repositorio para la entitdad NamespaceUser $repository = $entityManager->getRepository('NamespaceUser'); // Obtengo el primer objeto User donde status = enabled $user = $repository->findOneBy(array('status' => 'enabled')); echo $user->getName(); findOneBy() jueves, 26 de septiembre de 13
  58. 58. Resumen DBAL 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
  59. 59. ¿Preguntas? jueves, 26 de septiembre de 13
  60. 60. ¡Gracias! jueves, 26 de septiembre de 13
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×