doctrine

Post on 12-Jun-2015

139 Views

Category:

Technology

6 Downloads

Preview:

Click to see full reader

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

top related