Doctrine
-
Upload
ismael-ambrosi -
Category
Technology
-
view
139 -
download
6
Transcript of Doctrine
![Page 1: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/1.jpg)
http://www.doctrine-project.org/jueves, 26 de septiembre de 13
![Page 2: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/2.jpg)
¿Qué es Doctrine?
jueves, 26 de septiembre de 13
![Page 3: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/3.jpg)
¿Qué es Doctrine?
• DBAL (Database abstraction layer)
• ORM (Object Relational Mapper)
jueves, 26 de septiembre de 13
![Page 4: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/4.jpg)
¿Qué significa DBAL?
jueves, 26 de septiembre de 13
![Page 5: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/5.jpg)
Database Abstraction Layer
jueves, 26 de septiembre de 13
![Page 6: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/6.jpg)
DBAL
“Powerful database abstraction layer with many features for database schema introspection, schema management and
PDO abstraction”
jueves, 26 de septiembre de 13
![Page 7: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/7.jpg)
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
![Page 8: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/8.jpg)
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
![Page 9: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/9.jpg)
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
![Page 10: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/10.jpg)
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
![Page 11: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/11.jpg)
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
![Page 12: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/12.jpg)
¿Qué es un ORM?
jueves, 26 de septiembre de 13
![Page 13: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/13.jpg)
Object-Relational Mapping
jueves, 26 de septiembre de 13
![Page 14: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/14.jpg)
"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
![Page 15: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/15.jpg)
ORM
• Transforma datos de la DB a objetos PHP
jueves, 26 de septiembre de 13
![Page 16: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/16.jpg)
ORM
• Transforma datos de la DB a objetos PHP
• Y de PHP a la DB
jueves, 26 de septiembre de 13
![Page 17: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/17.jpg)
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
![Page 18: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/18.jpg)
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
![Page 19: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/19.jpg)
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
![Page 20: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/20.jpg)
ORM
¿Qué nos soluciona?
jueves, 26 de septiembre de 13
![Page 21: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/21.jpg)
ORM¿Qué nos soluciona?
• Podemos utilizar orientación a objetos
jueves, 26 de septiembre de 13
![Page 22: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/22.jpg)
ORM¿Qué nos soluciona?
• Podemos utilizar orientación a objetos
• Evita tener SQL en todos lados
jueves, 26 de septiembre de 13
![Page 23: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/23.jpg)
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
![Page 24: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/24.jpg)
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
![Page 25: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/25.jpg)
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
![Page 26: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/26.jpg)
ORM
¿Problemas?
jueves, 26 de septiembre de 13
![Page 27: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/27.jpg)
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
![Page 28: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/28.jpg)
ORM
EntityManager
jueves, 26 de septiembre de 13
![Page 29: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/29.jpg)
ORMEntityManager
• Responsable de gestionar la persistencia y obtención de entidades
jueves, 26 de septiembre de 13
![Page 30: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/30.jpg)
ORMEntityManager
• Responsable de gestionar la persistencia y obtención de entidades
• Uno por conexión
jueves, 26 de septiembre de 13
![Page 31: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/31.jpg)
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
![Page 32: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/32.jpg)
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
![Page 33: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/33.jpg)
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
![Page 34: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/34.jpg)
ORMEntity Manager
// Indica al EntityManager que se// debe persistir la entidad en la db$entityManager->persist($entity);
persist()
jueves, 26 de septiembre de 13
![Page 35: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/35.jpg)
ORMEntity Manager
// Escribe los cambios en la base de datos$entityManager->flush();
flush()
jueves, 26 de septiembre de 13
![Page 36: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/36.jpg)
ORM
Entidades
jueves, 26 de septiembre de 13
![Page 37: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/37.jpg)
ORMEntidades
• Objetos PHP
jueves, 26 de septiembre de 13
![Page 38: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/38.jpg)
ORMEntidades
• Objetos PHP
• Representan a una tabla en la BD
jueves, 26 de septiembre de 13
![Page 39: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/39.jpg)
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
![Page 40: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/40.jpg)
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
![Page 41: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/41.jpg)
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
![Page 42: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/42.jpg)
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
![Page 43: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/43.jpg)
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
![Page 44: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/44.jpg)
ORM
Relaciones entre entidades
jueves, 26 de septiembre de 13
![Page 45: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/45.jpg)
ORMRelaciones entre entidades
•OneToOne
•OneToMany•ManyToOne
•ManyToMany
jueves, 26 de septiembre de 13
![Page 46: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/46.jpg)
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
![Page 47: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/47.jpg)
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
![Page 48: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/48.jpg)
ORM
Repositorios
jueves, 26 de septiembre de 13
![Page 49: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/49.jpg)
ORMRepositorios
• Nos da acceso a los datos
jueves, 26 de septiembre de 13
![Page 50: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/50.jpg)
ORMRepositorios
• Nos da acceso a los datos
• Independiente de como se persisten los datos
jueves, 26 de septiembre de 13
![Page 51: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/51.jpg)
ORMRepositorios
• Nos da acceso a los datos
• Independiente de como se persisten los datos
• Existe uno por entidad
jueves, 26 de septiembre de 13
![Page 52: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/52.jpg)
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
![Page 53: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/53.jpg)
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
![Page 54: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/54.jpg)
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
![Page 55: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/55.jpg)
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
![Page 56: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/56.jpg)
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
![Page 57: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/57.jpg)
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
![Page 58: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/58.jpg)
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
![Page 59: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/59.jpg)
¿Preguntas?
jueves, 26 de septiembre de 13
![Page 60: Doctrine](https://reader036.fdocuments.mx/reader036/viewer/2022062706/557ae338d8b42a8f648b532c/html5/thumbnails/60.jpg)
¡Gracias!
jueves, 26 de septiembre de 13