O modelo.
Doctrine2
Nacho Martín
El modelo
 en MVC
Smart User Interface
 <html>
 <head>
 <title>Mi primera web dinámica</title>
 </head>
 <body>
 <blink><?php $visitas = consulta_SQL('visitas');
     echo $visitas;
     guarda_SQL($visitas + 1);
     ?></blink>
 </body>
 </html>
Vista

Controlador

  Modelo
Vista
 Controlador



Modelo
“
Responsable de representar conceptos sobre
la situación del dominio y sus reglas.
Los detalles de almacenamiento se delegan
en la infraestructura.
                                          “
       Eric Evans, Domain Driven Design
“
Responsable de representar conceptos sobre
la situación del dominio y sus reglas.
Los detalles de almacenamiento se delegan
en la infraestructura.
Esta capa es el corazón del software.
                                          “
       Eric Evans, Domain Driven Design
“
                                  “
Symfony2 va sobre proporcionar herramientas
para el Controlador y la Vista, pero no para
el Modelo.
                      Fabien Potencier
Doctrine
Puente entre el modelo
relacional y los objetos         Doctrine ORM
API de la capa de
abstracción de la BD             Doctrine DBAL
API interfaz para distintos
drivers de BD                           PDO

           MS SQL Server, Firebird/Interbase, IBM, INFORMIX,
           MySQL, Oracle, ODBC y DB2, PostgreSQL, SQLite
DBAL
# app/config/config.yml
doctrine:
    dbal:
        driver:     pdo_mysql
        dbname:     Symfony2
        user:       root
        password:   null
        charset:    UTF8
$conn = $this->get('database_connection');
$users = $conn->fetchAll('SELECT * FROM users');
<?php
$conn = $this->get('database_connection');
$queryBuilder = $conn->createQueryBuilder();
$users = $queryBuilder
         ->select('u.id')
         ->addSelect('p.id')
         ->from('users', 'u')
         ->leftJoin('u', 'phonenumbers', 'u.id = p.user_id')
         ->setFirstResult(30)
         ->setMaxResults(25)
         ->execute();
ORM
ActiveRecord
 (Doctrine 1)

         Post
id
título
autor
tags
save()
delete()
...
ActiveRecord     DataMapper
 (Doctrine 1)    (Doctrine 2)

         Post            Post
id              id
título          título
autor           autor
tags            tags
save()
delete()
...
Record
Entidad
class Post
{
    private   $id;
    private   $titulo;
    private   $autor;
    private   $tags;
}
class Post
{

    private $id;

    private $titulo;

    private $autor;

    private $tags;
}
/**
* @ORMTable(name="post")
* @ORMEntity
*/
class Post
{
/**
* @ORMId
* @ORMColumn(type="integer")
* @ORMGeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
 * @ORMColumn(type="string")
 */
private $titulo;
string

integer     date

 float       time

smallint   datetime

 bigint      text

boolean     object

decimal     array
/**
 * @ORMManyToOne(targetEntity="User",
 *    inversedBy="posts", cascade={"remove"})
 * @ORMJoinColumn(name="user_id", referencedColumnName="id")
 */
private $autor;
/**
 * @ORMManyToMany(targetEntity="Tag", inversedBy="Posts")
 * @ORMJoinTable(name="post_tag",
 *      joinColumns={@ORMJoinColumn(name="tag_id",
 *          referencedColumnName="id")},
 *      inverseJoinColumns={@ORMJoinColumn(name="post_id",
 *          referencedColumnName="id")}
 * )
 */
private $tags;
php app/console doctrine:generate:entities AcmeStoreBundle
$user = new ForumUser();
$user->setName('Nacho');
$name = $user->getName();
$comment = new Comment();

$user->addComment($comment);
Entity Manager
$em = $this->getDoctrine()->getEntityManager();

$dql = "SELECT t FROM AcmeMiBundleEntityTask t";
$dql .= " WHERE t.proyecto = :proyecto";
$dql .= " AND t.posicion > :minpos";
$dql .= "ORDER BY t.prioridad"
$query = $em->createQuery($dql);

$query->setParameters(array(
      'project' => $project,
      'minpos' => 10,
));

$tareas = $query->getResult();
$query = $em->createQuery('SELECT u, a FROM ForumUser u JOIN u.avatar a');
$users = $query->getResult(); //Array
echo $users[0]->getAvatar()->getFilename();
$qb = $em->createQueryBuilder()
     ->where('p.precio > :precio')
     ->setParameter('precio', '19.99')
     ->orderBy('p.precio', 'ASC')
     ->getQuery();

$productos = $query->getResult();
Query#getResult()
Query#getSingleResult()          BD
Query#getOneOrNullResult()
Query#getArrayResult()
Query#getScalarResult()
Query#getSingleScalarResult()   Post

                          Tag1         Tag2
Repositorio
“
                                      “
Proporciona la ilusión de tener una colección
en memoria de todos los objetos de un tipo.
Permite acceso mediante una interfaz común.
           Eric Evans, Domain Driven Design
$producto = $repository->find($id);

$producto = $repository->findOneByNombre('Thermomix');

$productos = $repository->findAll();

$productos = $repository->findByPrecio(19.99);

$productos = $repository->createQueryBuilder('p')->...
<?php
/**
  * ABBundleEntity
 *
 * @ORMTable(name="ponencia")
 * @ORMEntity(repositoryClass="ABBundleEntityPonenciaRepository")
 */
class Ponencia
{
DDD
Migraciones



    BD




 Definición
Migraciones



    BD



              Comparación



 Definición
Migraciones



    BD



              Comparación



 Definición                 Diff
Migraciones



    BD



              Comparación



 Definición                 Diff
Migraciones



    BD                      BD'



              Comparación



 Definición                 Diff
php app/console doctrine:migrations:diff


php app/console doctrine:migrations:migrate
La familia Doctrine
MongoDB ODM
CouchDB ODM
PHPCR ODM
Doctrine Search
Vida más allá
?
Qué hay del rendimiento?
Patrón Polish Rider
Patrón Balkan Partisan
¿Preguntas?
Gracias
 nitram.ohcan@gmail.com
 @nacmartin


      limenius.com

Doctrine2 sf2Vigo