Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Doctrine

507 views

Published on

Published in: Technology
  • Be the first to comment

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

×