Post on 20-Jan-2015
description
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Desarrollo rápido con PHP y Symfony(IV) El Modelo
David J. Brenes Martínez
Curso de Extensión UniversitariaDesarrollo web avanzado
Universidad de Oviedo
2010/03/22
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Encajando objetos y Base de Datos
PHP es un lenguaje orientado a ObjetosLas Bases de datos más comunes son RelacionalesNormalmente la traducción es sencillaAlgunos escenarios son más complicados
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Enlaces entre objetos
Práctica comun en Orientacion a ObjetosEn Base de Datos se traduce como un campo nuevoen una tablaRecurrimos a Joins para enlazar los datos relacionados
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Herencia
Práctica comun en Orientacion a ObjetosEn Base de Datos la solución no es inmediata
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
ORMs
Herramientas que tratan de acercar la Orientación aObjetos y las Bases de DatosNos esconden la ‘complejidad’ de ciertos problemasAutomatizan trabajoDejamos de trabajar con tablas y Bases de Datos paratrabajar con objetosO casi. . .
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
ORMs
.NET: LinQ, nHibernateJava: Hibernate, Spring, JPARuby: ActiveRecordPHP: Propel, Doctrine
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
ORMs en Symfony
2 alternativas: Propel, DoctrineHasta Symfony 1.2 Propel era el recomendadoÚltimas versiones recomiendan DoctrineNúcleo del modelo
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
databases.yml
Fichero de configuracion de Base de DatosPresente en directorio config del proyectoConfiguras una base de datos por entornoEscoges que tipo de Base de Datos usar
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Cambio de Base de Datos
Solo sería necesario cambiar databases.ymlPodrías cambiar de host de Base de Datos e incluso deSGBD (MySQL, PostgreSQL, Oracle, etc. . . )
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
schema.yml
Es el fichero de configuración del modelo de datos.En este fichero se define las tablas que va a haber enla Base de Datos y sus columnasSe definen también características de los objetos
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Ejemplo
Coche :actAs : { Timestampable : ~ }columns :
i d :ma t r i cu la : { type : s t r i n g (255) }conductor_ id : { type : i n t e g e r }
r e l a t i o n s :author :
onDelete : CASCADEl o c a l : conductor_ idf o r e i g n : i df o r e i g n A l i a s : Usuario
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Atributos
NombreTipo de datosOpciones adicionales (notnull, unique. . . )
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Atributos
boo lean_ f i e l d : { type : boolean , defaul t : 1 }
s t r i n g _ f i e l d : s t r i n g (255)
d e t a i l e d _ f i e l d :type : s t r i n g (255)n o t n u l l : true
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Relaciones
Indica cómo un objeto se relaciona con los demásSe definirán claves externas y triggersEn el modelo las relaciones serán transparentes
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Relaciones
Car :r e l a t i o n s :
d r i v e r :onDelete : CASCADEl o c a l : d r i v e r _ i df o r e i g n : i dc lass : User
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Tipos de relaciones
Los atributos type y foreign-type controlan lacardinalidadSus valores son one y many
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Relaciones many-to-many
En Base de datos se requiere una tabla extraEn Schema.yml podemos definir la tabla intermedia
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Relaciones many-to-many
Car :Re la t ions :
InsurancedDr iver :c lass : Userf o r e i g n A l i a s : InsuranceDr iversl o c a l : ca r_ idf o r e i g n : d r i v e r _ i dre fC lass : Insurance
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Relaciones many-to-many
Insurance :columns :
d r i v e r _ i d : { type : i n t e g e r }ca r_ id : { type : i n t e g e r }p r i ce : { type : f l o a t }
r e l a t i o n s :Dr i ve r :
l o c a l : d r i v e r _ i df o r e i g n : i d
Car :l o c a l : ca r_ idf o r e i g n : i d
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Comportamientos
Definen un conjunto de atributos y un comportamientoante ciertos eventosEs una manera de reutilizar aspectos comunes demodelosTimestampable, Geographical, I18N, SoftDelete,Sluggable. . .
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Comportamientos
Podemos definir nuestros propios cmportamientosLos coportamientos pueden recibir parámetrosLos comportamientos pueden anidarse
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Herencia
Es posible simular la herencia de la programaciónorientada a objetosSe aplican distintos esquemas para cada tipo deherencia deseadoTipos: Concrete, Simple y Column Agregation
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Herencia Concrete
Se crea una tabla para la clase padre y una tabla paracada clase hijaLas tablas hijas tienen las mismas columnas que lapadre, más las columnas agregadas
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Herencia Simple
Se crea solo una tabla para la clase padreLas tablas padre tiene las columnas de la clase padremás las agregadas por las clases hijasNo se diferencia de qué tipo concreto es cada fila de laBase de Datos
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Herencia Column Agregation
Se crea solo una tabla para la clase padreLas tablas padre tiene las columnas de la clase padremás las agregadas por las clases hijasHay una columna adicional, que indica el tipo concretode cada fila
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
El modelo
doctrine:build_model genera las clases a partir delfichero de esquemaLas clases quedan en lib/model
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Clases generadas
Clase del modelo: Clase vacía que hereda de unaclase baseClase base: Clase con toda la informacion del modeloClase Table: Realiza las operaciones con la Base deDatos
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Clases generadas
Nunca debe hacerse referencia a la clase base nimodificarlaLa clase base se reescribe cada vez que construimosel modeloPodemos perder modificaciones
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
El SQL
Tarea doctrine:build-sql : genera el SQL del modeloEl SQL ha sido optimizado para la Base de Datosindicada en datbases.ymlTambién sufre las limitaciones de esa Base de Datos
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
El SQL
Tarea doctrine:insert-sql : ejecuta el SQL sobre la basede datosTarea doctrine:build-db: Crea la Base de Datos para elmodelo
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Zona de Administración
Tarea doctrine:generate-admin: Genera un módulo deadministración para una clase del modeloTarea doctrine:generate-module: Genera un móduloCRUD para una clase del modelo
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Fixtures
Mecanismo de carga de datosPermite tener unos datos básicos para desarrollo otesting
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Datos simples
User :user1 :
name : Loremuser2 :
name : Ipsumuser3 :
name : Doloruser4 :
name : s i t
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Relaciones
Car :car1 :
ma t r i cu la : 0000AAADr i ve r : user_1
car2 :ma t r i cu la : 0000AAADr i ve r : user_3
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Tareas de las fixtures
Tarea doctrine:data-load : Carga datos a la Base deDatosTarea doctrine:data-dump: Descarga datos de la Basede Datos
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Queries
Ejecutamos consultas a la Base de Datos a través dela clase Table.Le pedimos a Doctrine que nos devuelva un objetoTable y construimos la consulta en ese objeto
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Queries
$query = Doct r ine : : getTable ( ’ User ’ )−>createQuery ( ’ u ’ ) ;
$ r e s u l t s = $query−>execute ;
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Queries
$query = Doct r ine : : getTable ( ’ User ’ )−>createQuery ( ’ u ’ )−>where ( ’ u . name = ? ’ , ’ brenes ’ ) ;
$ r e s u l t s = $query−>execute ;
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Finders
Métodos que obtienen datos a través de valores deatributosNos ahorran el tener que crear queries
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Finders
$ r e s u l t = Doct r ine : : getTable ( ’ User ’ )−>findOneByName ( ’ brenes ’ ) ;
$ r e s u l t s = Doct r ine : : getTable ( ’ User ’ )−>findByName ( ’ brenes ’ ) ;
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Modificando datos
Los objetos tienen atributos que corresponden a lascolumnasModificamos los atributosEjecutamos el método save() para grabar
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Referencias
Symfony Project: www.symfony-project.orgThe Symfony Reference Book: http://www.symfony-project.org/reference/1_4/en/
Practical Symfony:http://www.symfony-project.org/jobeet/1_4/Doctrine/en/
The Definitive Guide to Symfony:http://www.symfony-project.org/book/1_2/
Symfony
David J.Brenes
Martínez
ORMs
Esquema ygeneración declasesBase de Datos
Fichero de esquema
Generación decódigo
Carga deDatos
Acceso aBase deDatos
Referencias,Créditos yLicencia
Licencia
Estas transparencias se publican bajo licencia CreativeCommons y se pueden redistribuir o modificar bajo lassiguientes condiciones:
Se dé reconocimiento al autor de estas transparencias.No se use con propósitos comerciales.Se distribuya con la misma licencia.
Texto de la licencia: http://creativecommons.org/licenses/by-nc-sa/3.0/