Symfony

                                              David J.
                                              Brenes
                                              Martínez

Desarrollo rápido con PHP y Symfony         ORMs

            (IV) El Modelo                  Esquema y
                                            generación de
                                            clases
                                            Base de Datos
                                            Fichero de esquema
                                            Generación de

        David J. Brenes Martínez            código

                                            Carga de
                                            Datos
         Curso de Extensión Universitaria
                                            Acceso a
            Desarrollo web avanzado         Base de
             Universidad de Oviedo          Datos

                                            Referencias,
                                            Créditos y
                 2010/03/22                 Licencia
Encajando objetos y Base de Datos

                                                       Symfony

                                                       David J.
                                                       Brenes
                                                       Martínez

                                                     ORMs

                                                     Esquema y
   PHP es un lenguaje orientado a Objetos            generación de
                                                     clases
   Las Bases de datos más comunes son Relacionales   Base de Datos
                                                     Fichero de esquema
                                                     Generación de
   Normalmente la traducción es sencilla             código

                                                     Carga de
   Algunos escenarios son más complicados            Datos

                                                     Acceso a
                                                     Base de
                                                     Datos

                                                     Referencias,
                                                     Créditos y
                                                     Licencia
Enlaces entre objetos

                                                               Symfony

                                                               David J.
                                                               Brenes
                                                               Martínez

                                                             ORMs

                                                             Esquema y
    Práctica comun en Orientacion a Objetos                  generación de
                                                             clases
    En Base de Datos se traduce como un campo nuevo          Base de Datos
                                                             Fichero de esquema

    en una tabla                                             Generación de
                                                             código

                                                             Carga de
    Recurrimos a Joins para enlazar los datos relacionados   Datos

                                                             Acceso a
                                                             Base de
                                                             Datos

                                                             Referencias,
                                                             Créditos y
                                                             Licencia
Herencia

                                                    Symfony

                                                    David J.
                                                    Brenes
                                                    Martínez

                                                  ORMs

                                                  Esquema y
                                                  generación de
                                                  clases
   Práctica comun en Orientacion a Objetos        Base de Datos
                                                  Fichero de esquema

   En Base de Datos la solución no es inmediata   Generación de
                                                  código

                                                  Carga de
                                                  Datos

                                                  Acceso a
                                                  Base de
                                                  Datos

                                                  Referencias,
                                                  Créditos y
                                                  Licencia
ORMs

                                                           Symfony

                                                           David J.
                                                           Brenes
                                                           Martínez


  Herramientas que tratan de acercar la Orientación a    ORMs

                                                         Esquema y
  Objetos y las Bases de Datos                           generación de
                                                         clases
  Nos esconden la ‘complejidad’ de ciertos problemas     Base de Datos
                                                         Fichero de esquema

  Automatizan trabajo                                    Generación de
                                                         código


  Dejamos de trabajar con tablas y Bases de Datos para   Carga de
                                                         Datos
  trabajar con objetos                                   Acceso a
                                                         Base de
  O casi. . .                                            Datos

                                                         Referencias,
                                                         Créditos y
                                                         Licencia
ORMs

                                   Symfony

                                   David J.
                                   Brenes
                                   Martínez

                                 ORMs

                                 Esquema y
  .NET: LinQ, nHibernate         generación de
                                 clases
  Java: Hibernate, Spring, JPA   Base de Datos
                                 Fichero de esquema
                                 Generación de
  Ruby: ActiveRecord             código

                                 Carga de
  PHP: Propel, Doctrine          Datos

                                 Acceso a
                                 Base de
                                 Datos

                                 Referencias,
                                 Créditos y
                                 Licencia
ORMs en Symfony

                                                   Symfony

                                                   David J.
                                                   Brenes
                                                   Martínez

                                                 ORMs

                                                 Esquema y
   2 alternativas: Propel, Doctrine              generación de
                                                 clases
   Hasta Symfony 1.2 Propel era el recomendado   Base de Datos
                                                 Fichero de esquema
                                                 Generación de
   Últimas versiones recomiendan Doctrine        código

                                                 Carga de
   Núcleo del modelo                             Datos

                                                 Acceso a
                                                 Base de
                                                 Datos

                                                 Referencias,
                                                 Créditos y
                                                 Licencia
databases.yml

                                                 Symfony

                                                 David J.
                                                 Brenes
                                                 Martínez

                                               ORMs

                                               Esquema y
   Fichero de configuracion de Base de Datos    generación de
                                               clases
   Presente en directorio config del proyecto   Base de Datos
                                               Fichero de esquema
                                               Generación de
   Configuras una base de datos por entorno     código

                                               Carga de
   Escoges que tipo de Base de Datos usar      Datos

                                               Acceso a
                                               Base de
                                               Datos

                                               Referencias,
                                               Créditos y
                                               Licencia
Cambio de Base de Datos

                                                             Symfony

                                                             David J.
                                                             Brenes
                                                             Martínez

                                                           ORMs

                                                           Esquema y
                                                           generación de
   Solo sería necesario cambiar databases.yml              clases
                                                           Base de Datos

   Podrías cambiar de host de Base de Datos e incluso de   Fichero de esquema
                                                           Generación de
                                                           código
   SGBD (MySQL, PostgreSQL, Oracle, etc. . . )
                                                           Carga de
                                                           Datos

                                                           Acceso a
                                                           Base de
                                                           Datos

                                                           Referencias,
                                                           Créditos y
                                                           Licencia
schema.yml

                                                            Symfony

                                                            David J.
                                                            Brenes
                                                            Martínez

                                                          ORMs

                                                          Esquema y
   Es el fichero de configuración del modelo de datos.      generación de
                                                          clases
   En este fichero se define las tablas que va a haber en   Base de Datos
                                                          Fichero de esquema

   la Base de Datos y sus columnas                        Generación de
                                                          código

                                                          Carga de
   Se definen también características de los objetos       Datos

                                                          Acceso a
                                                          Base de
                                                          Datos

                                                          Referencias,
                                                          Créditos y
                                                          Licencia
Ejemplo

                                                           Symfony

                                                           David J.
Coche :                                                    Brenes
                                                           Martínez
  actAs : { Timestampable : ~ }
                                                         ORMs
  columns :
                                                         Esquema y
      id :                                               generación de
                                                         clases
      m a t r i c u l a : { type : s t r i n g (255) }   Base de Datos

      conductor_id : { type : i n t e g e r }            Fichero de esquema
                                                         Generación de
                                                         código
  relations :
                                                         Carga de
      author :                                           Datos

          onDelete : CASCADE                             Acceso a
                                                         Base de
  l o c a l : conductor_id                               Datos

  foreign : id                                           Referencias,
                                                         Créditos y
  f o r e i g n A l i a s : Usuario                      Licencia
Atributos

                                                     Symfony

                                                     David J.
                                                     Brenes
                                                     Martínez

                                                   ORMs

                                                   Esquema y
                                                   generación de
    Nombre                                         clases
                                                   Base de Datos

    Tipo de datos                                  Fichero de esquema
                                                   Generación de
                                                   código
    Opciones adicionales (notnull, unique. . . )   Carga de
                                                   Datos

                                                   Acceso a
                                                   Base de
                                                   Datos

                                                   Referencias,
                                                   Créditos y
                                                   Licencia
Atributos

                                                                           Symfony

                                                                           David J.
                                                                           Brenes
                                                                           Martínez

                                                                         ORMs

 b o o l e a n _ f i e l d : { t y p e : boolean , d e f a u l t : 1 }   Esquema y
                                                                         generación de
                                                                         clases
                                                                         Base de Datos
 string_field :         s t r i n g (255)                                Fichero de esquema
                                                                         Generación de
                                                                         código


 detailed_field :                                                        Carga de
                                                                         Datos
   type : s t r i n g (255)                                              Acceso a
   n o t n u l l : true                                                  Base de
                                                                         Datos

                                                                         Referencias,
                                                                         Créditos y
                                                                         Licencia
Relaciones

                                                        Symfony

                                                        David J.
                                                        Brenes
                                                        Martínez

                                                      ORMs

                                                      Esquema y
                                                      generación de
   Indica cómo un objeto se relaciona con los demás   clases
                                                      Base de Datos

   Se definirán claves externas y triggers             Fichero de esquema
                                                      Generación de
                                                      código
   En el modelo las relaciones serán transparentes    Carga de
                                                      Datos

                                                      Acceso a
                                                      Base de
                                                      Datos

                                                      Referencias,
                                                      Créditos y
                                                      Licencia
Relaciones

                               Symfony

                               David J.
                               Brenes
                               Martínez

                             ORMs
Car :
                             Esquema y
  relations :                generación de
                             clases
      driver :               Base de Datos

        onDelete : CASCADE   Fichero de esquema
                             Generación de
                             código
        local : driver_id
                             Carga de
        foreign : id         Datos

        c l a s s : User     Acceso a
                             Base de
                             Datos

                             Referencias,
                             Créditos y
                             Licencia
Tipos de relaciones

                                                       Symfony

                                                       David J.
                                                       Brenes
                                                       Martínez

                                                     ORMs

                                                     Esquema y
                                                     generación de
    Los atributos type y foreign-type controlan la   clases
                                                     Base de Datos
    cardinalidad                                     Fichero de esquema
                                                     Generación de
                                                     código
    Sus valores son one y many
                                                     Carga de
                                                     Datos

                                                     Acceso a
                                                     Base de
                                                     Datos

                                                     Referencias,
                                                     Créditos y
                                                     Licencia
Relaciones many-to-many

                                                        Symfony

                                                        David J.
                                                        Brenes
                                                        Martínez

                                                      ORMs

                                                      Esquema y
                                                      generación de
                                                      clases
   En Base de datos se requiere una tabla extra       Base de Datos
                                                      Fichero de esquema

   En Schema.yml podemos definir la tabla intermedia   Generación de
                                                      código

                                                      Carga de
                                                      Datos

                                                      Acceso a
                                                      Base de
                                                      Datos

                                                      Referencias,
                                                      Créditos y
                                                      Licencia
Relaciones many-to-many

                                            Symfony

                                            David J.
                                            Brenes
                                            Martínez

Car :                                     ORMs

  Relations :                             Esquema y
                                          generación de
      InsurancedDriver :                  clases
                                          Base de Datos
        c l a s s : User                  Fichero de esquema
                                          Generación de
        foreignAlias : InsuranceDrivers   código


        local : car_id                    Carga de
                                          Datos
        foreign : driver_id               Acceso a
        refClass : Insurance              Base de
                                          Datos

                                          Referencias,
                                          Créditos y
                                          Licencia
Relaciones many-to-many

                                                     Symfony

                                                     David J.
Insurance :                                          Brenes
                                                     Martínez
  columns :
                                                   ORMs
    d r i v e r _ i d : { type : i n t e g e r }
                                                   Esquema y
    car_id : { type : i n t e g e r }              generación de
                                                   clases
    p r i c e : { type : f l o a t }               Base de Datos

  relations :                                      Fichero de esquema
                                                   Generación de
                                                   código
    Driver :
                                                   Carga de
        local : driver_id                          Datos

        foreign : id                               Acceso a
                                                   Base de
    Car :                                          Datos

        local : car_id                             Referencias,
                                                   Créditos y
        foreign : id                               Licencia
Comportamientos

                                                           Symfony

                                                           David J.
                                                           Brenes
                                                           Martínez

                                                         ORMs
   Definen un conjunto de atributos y un comportamiento   Esquema y
                                                         generación de
   ante ciertos eventos                                  clases
                                                         Base de Datos
   Es una manera de reutilizar aspectos comunes de       Fichero de esquema
                                                         Generación de
   modelos                                               código

                                                         Carga de
   Timestampable, Geographical, I18N, SoftDelete,        Datos

   Sluggable. . .                                        Acceso a
                                                         Base de
                                                         Datos

                                                         Referencias,
                                                         Créditos y
                                                         Licencia
Comportamientos

                                                      Symfony

                                                      David J.
                                                      Brenes
                                                      Martínez

                                                    ORMs

                                                    Esquema y
                                                    generación de
   Podemos definir nuestros propios cmportamientos   clases
                                                    Base de Datos

   Los coportamientos pueden recibir parámetros     Fichero de esquema
                                                    Generación de
                                                    código
   Los comportamientos pueden anidarse              Carga de
                                                    Datos

                                                    Acceso a
                                                    Base de
                                                    Datos

                                                    Referencias,
                                                    Créditos y
                                                    Licencia
Herencia

                                                         Symfony

                                                         David J.
                                                         Brenes
                                                         Martínez

                                                       ORMs

   Es posible simular la herencia de la programación   Esquema y
                                                       generación de
   orientada a objetos                                 clases
                                                       Base de Datos
                                                       Fichero de esquema
   Se aplican distintos esquemas para cada tipo de     Generación de
                                                       código
   herencia deseado                                    Carga de
                                                       Datos
   Tipos: Concrete, Simple y Column Agregation
                                                       Acceso a
                                                       Base de
                                                       Datos

                                                       Referencias,
                                                       Créditos y
                                                       Licencia
Herencia Concrete

                                                              Symfony

                                                              David J.
                                                              Brenes
                                                              Martínez

                                                            ORMs

                                                            Esquema y
   Se crea una tabla para la clase padre y una tabla para   generación de
                                                            clases
   cada clase hija                                          Base de Datos
                                                            Fichero de esquema
                                                            Generación de
   Las tablas hijas tienen las mismas columnas que la       código


   padre, más las columnas agregadas                        Carga de
                                                            Datos

                                                            Acceso a
                                                            Base de
                                                            Datos

                                                            Referencias,
                                                            Créditos y
                                                            Licencia
Herencia Simple

                                                               Symfony

                                                               David J.
                                                               Brenes
                                                               Martínez

                                                             ORMs

                                                             Esquema y
   Se crea solo una tabla para la clase padre                generación de
                                                             clases
   Las tablas padre tiene las columnas de la clase padre     Base de Datos
                                                             Fichero de esquema
   más las agregadas por las clases hijas                    Generación de
                                                             código

   No se diferencia de qué tipo concreto es cada fila de la   Carga de
                                                             Datos
   Base de Datos
                                                             Acceso a
                                                             Base de
                                                             Datos

                                                             Referencias,
                                                             Créditos y
                                                             Licencia
Herencia Column Agregation

                                                              Symfony

                                                              David J.
                                                              Brenes
                                                              Martínez

                                                            ORMs

                                                            Esquema y
   Se crea solo una tabla para la clase padre               generación de
                                                            clases
   Las tablas padre tiene las columnas de la clase padre    Base de Datos
                                                            Fichero de esquema
   más las agregadas por las clases hijas                   Generación de
                                                            código

   Hay una columna adicional, que indica el tipo concreto   Carga de
                                                            Datos
   de cada fila
                                                            Acceso a
                                                            Base de
                                                            Datos

                                                            Referencias,
                                                            Créditos y
                                                            Licencia
El modelo

                                                           Symfony

                                                           David J.
                                                           Brenes
                                                           Martínez

                                                         ORMs

                                                         Esquema y
                                                         generación de
   doctrine:build_model genera las clases a partir del   clases
                                                         Base de Datos
   fichero de esquema                                     Fichero de esquema
                                                         Generación de
                                                         código
   Las clases quedan en lib/model
                                                         Carga de
                                                         Datos

                                                         Acceso a
                                                         Base de
                                                         Datos

                                                         Referencias,
                                                         Créditos y
                                                         Licencia
Clases generadas

                                                            Symfony

                                                            David J.
                                                            Brenes
                                                            Martínez

                                                          ORMs

                                                          Esquema y
   Clase del modelo: Clase vacía que hereda de una        generación de
                                                          clases
   clase base                                             Base de Datos
                                                          Fichero de esquema
   Clase base: Clase con toda la informacion del modelo   Generación de
                                                          código

   Clase Table: Realiza las operaciones con la Base de    Carga de
                                                          Datos
   Datos
                                                          Acceso a
                                                          Base de
                                                          Datos

                                                          Referencias,
                                                          Créditos y
                                                          Licencia
Clases generadas

                                                           Symfony

                                                           David J.
                                                           Brenes
                                                           Martínez

                                                         ORMs

   Nunca debe hacerse referencia a la clase base ni      Esquema y
                                                         generación de
   modificarla                                            clases
                                                         Base de Datos
                                                         Fichero de esquema
   La clase base se reescribe cada vez que construimos   Generación de
                                                         código
   el modelo                                             Carga de
                                                         Datos
   Podemos perder modificaciones
                                                         Acceso a
                                                         Base de
                                                         Datos

                                                         Referencias,
                                                         Créditos y
                                                         Licencia
El SQL

                                                           Symfony

                                                           David J.
                                                           Brenes
                                                           Martínez

                                                         ORMs

                                                         Esquema y
   Tarea doctrine:build-sql: genera el SQL del modelo    generación de
                                                         clases
                                                         Base de Datos
   El SQL ha sido optimizado para la Base de Datos       Fichero de esquema
                                                         Generación de
   indicada en datbases.yml                              código

                                                         Carga de
   También sufre las limitaciones de esa Base de Datos   Datos

                                                         Acceso a
                                                         Base de
                                                         Datos

                                                         Referencias,
                                                         Créditos y
                                                         Licencia
El SQL

                                                               Symfony

                                                               David J.
                                                               Brenes
                                                               Martínez

                                                             ORMs

                                                             Esquema y
                                                             generación de
   Tarea doctrine:insert-sql: ejecuta el SQL sobre la base   clases
   de datos                                                  Base de Datos
                                                             Fichero de esquema
                                                             Generación de
   Tarea doctrine:build-db: Crea la Base de Datos para el    código


   modelo                                                    Carga de
                                                             Datos

                                                             Acceso a
                                                             Base de
                                                             Datos

                                                             Referencias,
                                                             Créditos y
                                                             Licencia
Zona de Administración

                                                           Symfony

                                                           David J.
                                                           Brenes
                                                           Martínez

                                                         ORMs

                                                         Esquema y
    Tarea doctrine:generate-admin: Genera un módulo de   generación de
                                                         clases
    administración para una clase del modelo             Base de Datos
                                                         Fichero de esquema
                                                         Generación de
    Tarea doctrine:generate-module: Genera un módulo     código


    CRUD para una clase del modelo                       Carga de
                                                         Datos

                                                         Acceso a
                                                         Base de
                                                         Datos

                                                         Referencias,
                                                         Créditos y
                                                         Licencia
Fixtures

                                                           Symfony

                                                           David J.
                                                           Brenes
                                                           Martínez

                                                         ORMs

                                                         Esquema y
                                                         generación de
    Mecanismo de carga de datos                          clases
                                                         Base de Datos

    Permite tener unos datos básicos para desarrollo o   Fichero de esquema
                                                         Generación de
                                                         código
    testing
                                                         Carga de
                                                         Datos

                                                         Acceso a
                                                         Base de
                                                         Datos

                                                         Referencias,
                                                         Créditos y
                                                         Licencia
Datos simples

                       Symfony

                       David J.
                       Brenes
                       Martínez
User :
                     ORMs
  user1 :            Esquema y
    name :   Lorem   generación de
                     clases
  user2 :            Base de Datos
                     Fichero de esquema
    name :   Ipsum   Generación de
                     código

  user3 :            Carga de
    name :   Dolor   Datos

                     Acceso a
  user4 :            Base de
                     Datos
    name :   sit
                     Referencias,
                     Créditos y
                     Licencia
Relaciones

                                      Symfony

                                      David J.
                                      Brenes
                                      Martínez

                                    ORMs
Car :
                                    Esquema y
  car1 :                            generación de
                                    clases
      m a t r i c u l a : 0000AAA   Base de Datos

      D r i v e r : user_1          Fichero de esquema
                                    Generación de
                                    código
  car2 :
                                    Carga de
      m a t r i c u l a : 0000AAA   Datos

      D r i v e r : user_3          Acceso a
                                    Base de
                                    Datos

                                    Referencias,
                                    Créditos y
                                    Licencia
Tareas de las fixtures

                                                            Symfony

                                                            David J.
                                                            Brenes
                                                            Martínez

                                                          ORMs

                                                          Esquema y
                                                          generación de
    Tarea doctrine:data-load: Carga datos a la Base de    clases
    Datos                                                 Base de Datos
                                                          Fichero de esquema
                                                          Generación de
    Tarea doctrine:data-dump: Descarga datos de la Base   código


    de Datos                                              Carga de
                                                          Datos

                                                          Acceso a
                                                          Base de
                                                          Datos

                                                          Referencias,
                                                          Créditos y
                                                          Licencia
Queries

                                                           Symfony

                                                           David J.
                                                           Brenes
                                                           Martínez

                                                         ORMs

                                                         Esquema y
   Ejecutamos consultas a la Base de Datos a través de   generación de
                                                         clases
   la clase Table.                                       Base de Datos
                                                         Fichero de esquema
                                                         Generación de
   Le pedimos a Doctrine que nos devuelva un objeto      código


   Table y construimos la consulta en ese objeto         Carga de
                                                         Datos

                                                         Acceso a
                                                         Base de
                                                         Datos

                                                         Referencias,
                                                         Créditos y
                                                         Licencia
Queries

                                                              Symfony

                                                              David J.
                                                              Brenes
                                                              Martínez

                                                            ORMs

                                                            Esquema y
                                                            generación de
$query = D o c t r i n e : : g e t T a b l e ( ’ User ’ )   clases
                                                            Base de Datos
   −>createQuery ( ’ u ’ ) ;                                Fichero de esquema
                                                            Generación de
$ r e s u l t s = $query−>execute ;                         código

                                                            Carga de
                                                            Datos

                                                            Acceso a
                                                            Base de
                                                            Datos

                                                            Referencias,
                                                            Créditos y
                                                            Licencia
Queries

                                                              Symfony

                                                              David J.
                                                              Brenes
                                                              Martínez

                                                            ORMs

$query = D o c t r i n e : : g e t T a b l e ( ’ User ’ )   Esquema y
                                                            generación de
  −>createQuery ( ’ u ’ )                                   clases
                                                            Base de Datos

  −>where ( ’ u . name = ? ’ , ’ brenes ’ ) ;               Fichero de esquema
                                                            Generación de
                                                            código

                                                            Carga de
 $ r e s u l t s = $query−>execute ;                        Datos

                                                            Acceso a
                                                            Base de
                                                            Datos

                                                            Referencias,
                                                            Créditos y
                                                            Licencia
Finders

                                                          Symfony

                                                          David J.
                                                          Brenes
                                                          Martínez

                                                        ORMs

                                                        Esquema y
                                                        generación de
    Métodos que obtienen datos a través de valores de   clases
                                                        Base de Datos
    atributos                                           Fichero de esquema
                                                        Generación de
                                                        código
    Nos ahorran el tener que crear queries
                                                        Carga de
                                                        Datos

                                                        Acceso a
                                                        Base de
                                                        Datos

                                                        Referencias,
                                                        Créditos y
                                                        Licencia
Finders

                                                                        Symfony

                                                                        David J.
                                                                        Brenes
                                                                        Martínez

                                                                      ORMs

 $ r e s u l t = D o c t r i n e : : g e t T a b l e ( ’ User ’ )     Esquema y
                                                                      generación de
    −>findOneByName ( ’ brenes ’ ) ;                                  clases
                                                                      Base de Datos
                                                                      Fichero de esquema
                                                                      Generación de

 $ r e s u l t s = D o c t r i n e : : g e t T a b l e ( ’ User ’ )   código

                                                                      Carga de
    −>findByName ( ’ brenes ’ ) ;                                     Datos

                                                                      Acceso a
                                                                      Base de
                                                                      Datos

                                                                      Referencias,
                                                                      Créditos y
                                                                      Licencia
Modificando datos

                                                           Symfony

                                                           David J.
                                                           Brenes
                                                           Martínez

                                                         ORMs

                                                         Esquema y
   Los objetos tienen atributos que corresponden a las   generación de
                                                         clases
   columnas                                              Base de Datos
                                                         Fichero de esquema

   Modificamos los atributos                              Generación de
                                                         código

                                                         Carga de
   Ejecutamos el método save() para grabar               Datos

                                                         Acceso a
                                                         Base de
                                                         Datos

                                                         Referencias,
                                                         Créditos y
                                                         Licencia
Referencias

                                                Symfony

                                                David J.
                                                Brenes
                                                Martínez

   Symfony Project: www.symfony-project.org   ORMs

   The Symfony Reference Book: http://www.    Esquema y
                                              generación de
   symfony-project.org/reference/1_4/en/      clases
                                              Base de Datos

   Practical Symfony:                         Fichero de esquema
                                              Generación de
                                              código
   http://www.symfony-project.org/jobeet/1_   Carga de
   4/Doctrine/en/                             Datos

                                              Acceso a
   The Definitive Guide to Symfony:            Base de
                                              Datos
   http://www.symfony-project.org/book/1_2/
                                              Referencias,
                                              Créditos y
                                              Licencia
Licencia

                                                               Symfony

                                                               David J.
                                                               Brenes
                                                               Martínez

Estas transparencias se publican bajo licencia Creative      ORMs
Commons y se pueden redistribuir o modificar bajo las         Esquema y
                                                             generación de
siguientes condiciones:                                      clases
                                                             Base de Datos
    Se dé reconocimiento al autor de estas transparencias.   Fichero de esquema
                                                             Generación de

    No se use con propósitos comerciales.                    código

                                                             Carga de
    Se distribuya con la misma licencia.                     Datos

                                                             Acceso a
Texto de la licencia: http:                                  Base de
                                                             Datos
//creativecommons.org/licenses/by-nc-sa/3.0/
                                                             Referencias,
                                                             Créditos y
                                                             Licencia

Desarrollo rápido con PHP y Symfony (IV): El Modelo

  • 1.
    Symfony David J. Brenes Martínez Desarrollo rápido con PHP y Symfony ORMs (IV) El Modelo Esquema y generación de clases Base de Datos Fichero de esquema Generación de David J. Brenes Martínez código Carga de Datos Curso de Extensión Universitaria Acceso a Desarrollo web avanzado Base de Universidad de Oviedo Datos Referencias, Créditos y 2010/03/22 Licencia
  • 2.
    Encajando objetos yBase de Datos Symfony David J. Brenes Martínez ORMs Esquema y PHP es un lenguaje orientado a Objetos generación de clases Las Bases de datos más comunes son Relacionales Base de Datos Fichero de esquema Generación de Normalmente la traducción es sencilla código Carga de Algunos escenarios son más complicados Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 3.
    Enlaces entre objetos Symfony David J. Brenes Martínez ORMs Esquema y Práctica comun en Orientacion a Objetos generación de clases En Base de Datos se traduce como un campo nuevo Base de Datos Fichero de esquema en una tabla Generación de código Carga de Recurrimos a Joins para enlazar los datos relacionados Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 4.
    Herencia Symfony David J. Brenes Martínez ORMs Esquema y generación de clases Práctica comun en Orientacion a Objetos Base de Datos Fichero de esquema En Base de Datos la solución no es inmediata Generación de código Carga de Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 5.
    ORMs Symfony David J. Brenes Martínez Herramientas que tratan de acercar la Orientación a ORMs Esquema y Objetos y las Bases de Datos generación de clases Nos esconden la ‘complejidad’ de ciertos problemas Base de Datos Fichero de esquema Automatizan trabajo Generación de código Dejamos de trabajar con tablas y Bases de Datos para Carga de Datos trabajar con objetos Acceso a Base de O casi. . . Datos Referencias, Créditos y Licencia
  • 6.
    ORMs Symfony David J. Brenes Martínez ORMs Esquema y .NET: LinQ, nHibernate generación de clases Java: Hibernate, Spring, JPA Base de Datos Fichero de esquema Generación de Ruby: ActiveRecord código Carga de PHP: Propel, Doctrine Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 7.
    ORMs en Symfony Symfony David J. Brenes Martínez ORMs Esquema y 2 alternativas: Propel, Doctrine generación de clases Hasta Symfony 1.2 Propel era el recomendado Base de Datos Fichero de esquema Generación de Últimas versiones recomiendan Doctrine código Carga de Núcleo del modelo Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 8.
    databases.yml Symfony David J. Brenes Martínez ORMs Esquema y Fichero de configuracion de Base de Datos generación de clases Presente en directorio config del proyecto Base de Datos Fichero de esquema Generación de Configuras una base de datos por entorno código Carga de Escoges que tipo de Base de Datos usar Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 9.
    Cambio de Basede Datos Symfony David J. Brenes Martínez ORMs Esquema y generación de Solo sería necesario cambiar databases.yml clases Base de Datos Podrías cambiar de host de Base de Datos e incluso de Fichero de esquema Generación de código SGBD (MySQL, PostgreSQL, Oracle, etc. . . ) Carga de Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 10.
    schema.yml Symfony David J. Brenes Martínez ORMs Esquema y Es el fichero de configuración del modelo de datos. generación de clases En este fichero se define las tablas que va a haber en Base de Datos Fichero de esquema la Base de Datos y sus columnas Generación de código Carga de Se definen también características de los objetos Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 11.
    Ejemplo Symfony David J. Coche : Brenes Martínez actAs : { Timestampable : ~ } ORMs columns : Esquema y id : generación de clases m a t r i c u l a : { type : s t r i n g (255) } Base de Datos conductor_id : { type : i n t e g e r } Fichero de esquema Generación de código relations : Carga de author : Datos onDelete : CASCADE Acceso a Base de l o c a l : conductor_id Datos foreign : id Referencias, Créditos y f o r e i g n A l i a s : Usuario Licencia
  • 12.
    Atributos Symfony David J. Brenes Martínez ORMs Esquema y generación de Nombre clases Base de Datos Tipo de datos Fichero de esquema Generación de código Opciones adicionales (notnull, unique. . . ) Carga de Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 13.
    Atributos Symfony David J. Brenes Martínez ORMs b o o l e a n _ f i e l d : { t y p e : boolean , d e f a u l t : 1 } Esquema y generación de clases Base de Datos string_field : s t r i n g (255) Fichero de esquema Generación de código detailed_field : Carga de Datos type : s t r i n g (255) Acceso a n o t n u l l : true Base de Datos Referencias, Créditos y Licencia
  • 14.
    Relaciones Symfony David J. Brenes Martínez ORMs Esquema y generación de Indica cómo un objeto se relaciona con los demás clases Base de Datos Se definirán claves externas y triggers Fichero de esquema Generación de código En el modelo las relaciones serán transparentes Carga de Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 15.
    Relaciones Symfony David J. Brenes Martínez ORMs Car : Esquema y relations : generación de clases driver : Base de Datos onDelete : CASCADE Fichero de esquema Generación de código local : driver_id Carga de foreign : id Datos c l a s s : User Acceso a Base de Datos Referencias, Créditos y Licencia
  • 16.
    Tipos de relaciones Symfony David J. Brenes Martínez ORMs Esquema y generación de Los atributos type y foreign-type controlan la clases Base de Datos cardinalidad Fichero de esquema Generación de código Sus valores son one y many Carga de Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 17.
    Relaciones many-to-many Symfony David J. Brenes Martínez ORMs Esquema y generación de clases En Base de datos se requiere una tabla extra Base de Datos Fichero de esquema En Schema.yml podemos definir la tabla intermedia Generación de código Carga de Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 18.
    Relaciones many-to-many Symfony David J. Brenes Martínez Car : ORMs Relations : Esquema y generación de InsurancedDriver : clases Base de Datos c l a s s : User Fichero de esquema Generación de foreignAlias : InsuranceDrivers código local : car_id Carga de Datos foreign : driver_id Acceso a refClass : Insurance Base de Datos Referencias, Créditos y Licencia
  • 19.
    Relaciones many-to-many Symfony David J. Insurance : Brenes Martínez columns : ORMs d r i v e r _ i d : { type : i n t e g e r } Esquema y car_id : { type : i n t e g e r } generación de clases p r i c e : { type : f l o a t } Base de Datos relations : Fichero de esquema Generación de código Driver : Carga de local : driver_id Datos foreign : id Acceso a Base de Car : Datos local : car_id Referencias, Créditos y foreign : id Licencia
  • 20.
    Comportamientos Symfony David J. Brenes Martínez ORMs Definen un conjunto de atributos y un comportamiento Esquema y generación de ante ciertos eventos clases Base de Datos Es una manera de reutilizar aspectos comunes de Fichero de esquema Generación de modelos código Carga de Timestampable, Geographical, I18N, SoftDelete, Datos Sluggable. . . Acceso a Base de Datos Referencias, Créditos y Licencia
  • 21.
    Comportamientos Symfony David J. Brenes Martínez ORMs Esquema y generación de Podemos definir nuestros propios cmportamientos clases Base de Datos Los coportamientos pueden recibir parámetros Fichero de esquema Generación de código Los comportamientos pueden anidarse Carga de Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 22.
    Herencia Symfony David J. Brenes Martínez ORMs Es posible simular la herencia de la programación Esquema y generación de orientada a objetos clases Base de Datos Fichero de esquema Se aplican distintos esquemas para cada tipo de Generación de código herencia deseado Carga de Datos Tipos: Concrete, Simple y Column Agregation Acceso a Base de Datos Referencias, Créditos y Licencia
  • 23.
    Herencia Concrete Symfony David J. Brenes Martínez ORMs Esquema y Se crea una tabla para la clase padre y una tabla para generación de clases cada clase hija Base de Datos Fichero de esquema Generación de Las tablas hijas tienen las mismas columnas que la código padre, más las columnas agregadas Carga de Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 24.
    Herencia Simple Symfony David J. Brenes Martínez ORMs Esquema y Se crea solo una tabla para la clase padre generación de clases Las tablas padre tiene las columnas de la clase padre Base de Datos Fichero de esquema más las agregadas por las clases hijas Generación de código No se diferencia de qué tipo concreto es cada fila de la Carga de Datos Base de Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 25.
    Herencia Column Agregation Symfony David J. Brenes Martínez ORMs Esquema y Se crea solo una tabla para la clase padre generación de clases Las tablas padre tiene las columnas de la clase padre Base de Datos Fichero de esquema más las agregadas por las clases hijas Generación de código Hay una columna adicional, que indica el tipo concreto Carga de Datos de cada fila Acceso a Base de Datos Referencias, Créditos y Licencia
  • 26.
    El modelo Symfony David J. Brenes Martínez ORMs Esquema y generación de doctrine:build_model genera las clases a partir del clases Base de Datos fichero de esquema Fichero de esquema Generación de código Las clases quedan en lib/model Carga de Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 27.
    Clases generadas Symfony David J. Brenes Martínez ORMs Esquema y Clase del modelo: Clase vacía que hereda de una generación de clases clase base Base de Datos Fichero de esquema Clase base: Clase con toda la informacion del modelo Generación de código Clase Table: Realiza las operaciones con la Base de Carga de Datos Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 28.
    Clases generadas Symfony David J. Brenes Martínez ORMs Nunca debe hacerse referencia a la clase base ni Esquema y generación de modificarla clases Base de Datos Fichero de esquema La clase base se reescribe cada vez que construimos Generación de código el modelo Carga de Datos Podemos perder modificaciones Acceso a Base de Datos Referencias, Créditos y Licencia
  • 29.
    El SQL Symfony David J. Brenes Martínez ORMs Esquema y Tarea doctrine:build-sql: genera el SQL del modelo generación de clases Base de Datos El SQL ha sido optimizado para la Base de Datos Fichero de esquema Generación de indicada en datbases.yml código Carga de También sufre las limitaciones de esa Base de Datos Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 30.
    El SQL Symfony David J. Brenes Martínez ORMs Esquema y generación de Tarea doctrine:insert-sql: ejecuta el SQL sobre la base clases de datos Base de Datos Fichero de esquema Generación de Tarea doctrine:build-db: Crea la Base de Datos para el código modelo Carga de Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 31.
    Zona de Administración Symfony David J. Brenes Martínez ORMs Esquema y Tarea doctrine:generate-admin: Genera un módulo de generación de clases administración para una clase del modelo Base de Datos Fichero de esquema Generación de Tarea doctrine:generate-module: Genera un módulo código CRUD para una clase del modelo Carga de Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 32.
    Fixtures Symfony David J. Brenes Martínez ORMs Esquema y generación de Mecanismo de carga de datos clases Base de Datos Permite tener unos datos básicos para desarrollo o Fichero de esquema Generación de código testing Carga de Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 33.
    Datos simples Symfony David J. Brenes Martínez User : ORMs user1 : Esquema y name : Lorem generación de clases user2 : Base de Datos Fichero de esquema name : Ipsum Generación de código user3 : Carga de name : Dolor Datos Acceso a user4 : Base de Datos name : sit Referencias, Créditos y Licencia
  • 34.
    Relaciones Symfony David J. Brenes Martínez ORMs Car : Esquema y car1 : generación de clases m a t r i c u l a : 0000AAA Base de Datos D r i v e r : user_1 Fichero de esquema Generación de código car2 : Carga de m a t r i c u l a : 0000AAA Datos D r i v e r : user_3 Acceso a Base de Datos Referencias, Créditos y Licencia
  • 35.
    Tareas de lasfixtures Symfony David J. Brenes Martínez ORMs Esquema y generación de Tarea doctrine:data-load: Carga datos a la Base de clases Datos Base de Datos Fichero de esquema Generación de Tarea doctrine:data-dump: Descarga datos de la Base código de Datos Carga de Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 36.
    Queries Symfony David J. Brenes Martínez ORMs Esquema y Ejecutamos consultas a la Base de Datos a través de generación de clases la clase Table. Base de Datos Fichero de esquema Generación de Le pedimos a Doctrine que nos devuelva un objeto código Table y construimos la consulta en ese objeto Carga de Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 37.
    Queries Symfony David J. Brenes Martínez ORMs Esquema y generación de $query = D o c t r i n e : : g e t T a b l e ( ’ User ’ ) clases Base de Datos −>createQuery ( ’ u ’ ) ; Fichero de esquema Generación de $ r e s u l t s = $query−>execute ; código Carga de Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 38.
    Queries Symfony David J. Brenes Martínez ORMs $query = D o c t r i n e : : g e t T a b l e ( ’ User ’ ) Esquema y generación de −>createQuery ( ’ u ’ ) clases Base de Datos −>where ( ’ u . name = ? ’ , ’ brenes ’ ) ; Fichero de esquema Generación de código Carga de $ r e s u l t s = $query−>execute ; Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 39.
    Finders Symfony David J. Brenes Martínez ORMs Esquema y generación de Métodos que obtienen datos a través de valores de clases Base de Datos atributos Fichero de esquema Generación de código Nos ahorran el tener que crear queries Carga de Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 40.
    Finders Symfony David J. Brenes Martínez ORMs $ r e s u l t = D o c t r i n e : : g e t T a b l e ( ’ User ’ ) Esquema y generación de −>findOneByName ( ’ brenes ’ ) ; clases Base de Datos Fichero de esquema Generación de $ r e s u l t s = D o c t r i n e : : g e t T a b l e ( ’ User ’ ) código Carga de −>findByName ( ’ brenes ’ ) ; Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 41.
    Modificando datos Symfony David J. Brenes Martínez ORMs Esquema y Los objetos tienen atributos que corresponden a las generación de clases columnas Base de Datos Fichero de esquema Modificamos los atributos Generación de código Carga de Ejecutamos el método save() para grabar Datos Acceso a Base de Datos Referencias, Créditos y Licencia
  • 42.
    Referencias Symfony David J. Brenes Martínez Symfony Project: www.symfony-project.org ORMs The Symfony Reference Book: http://www. Esquema y generación de symfony-project.org/reference/1_4/en/ clases Base de Datos Practical Symfony: Fichero de esquema Generación de código http://www.symfony-project.org/jobeet/1_ Carga de 4/Doctrine/en/ Datos Acceso a The Definitive Guide to Symfony: Base de Datos http://www.symfony-project.org/book/1_2/ Referencias, Créditos y Licencia
  • 43.
    Licencia Symfony David J. Brenes Martínez Estas transparencias se publican bajo licencia Creative ORMs Commons y se pueden redistribuir o modificar bajo las Esquema y generación de siguientes condiciones: clases Base de Datos Se dé reconocimiento al autor de estas transparencias. Fichero de esquema Generación de No se use con propósitos comerciales. código Carga de Se distribuya con la misma licencia. Datos Acceso a Texto de la licencia: http: Base de Datos //creativecommons.org/licenses/by-nc-sa/3.0/ Referencias, Créditos y Licencia