Para crear el modelo de objetos de datos que utiliza Symfony, se debe traducir el modelo relacional de la base de datos a un modelo de objetos de datos. Para realizar ese mapeo o traducción, el ORM necesita una descripción del modelo relacional, que se llama "esquema" schema). En el esquema se definen las tablas, sus relaciones y las características de sus columnas.
La sintaxis que utiliza Symfony para definir los esquemas hace uso del formato YAML. Los archivos schema.yml
deben guardarse en el directorio miproyecto/config/doctrine
.
8.2.1. Ejemplo de esquema
¿Cómo se traduce la estructura de una base de datos a un esquema? La mejor forma de entenderlo es mediante un ejemplo. En el ejemplo se supone que se tiene una base de datos de un blog con dos tablas: blog_articulo
y blog_comentario
, con la estructura que se muestra en la figura 8-1.
En este caso, el archivo schema.yml
debería ser el del listado 8-3.
Listado 8-3 - Ejemplo de schema.yml
Articulo:
actAs: [Timestampable]
tableName: blog_articulo
columns:
id:
type: integer
primary: true
autoincrement: true
titulo: string(255)
contenido: clob
Comentario:
actAs: [Timestampable]
tableName: blog_comentario
columns:
id:
type: integer
primary: true
autoincrement: true
articulo_id: integer
autor: string(255)
contenido: clob
relations:
Articulo:
onDelete: CASCADE
foreignAlias: Comentarios
Observa como el nombre de la propia base de datos (blog
) no aparece en el archivo schema.yml
. En su lugar, la base de datos se describe bajo el nombre de una conexión (doctrine
en el ejemplo anterior). El motivo es que las opciones de conexión con la base de datos pueden depender del entorno en el que se está ejecutando la aplicación. Si se accede a la aplicación en el entorno de desarrollo, es posible que se acceda a la base de datos de desarrollo (por ejemplo blog_dev
) pero con el mismo esquema que en la base de datos de producción. Las opciones de conexión con la base de datos se especifican en el archivo databases.yml
, que se describe más adelante en este capítulo en la sección "Conexiones con la base de datos". El esquema no contiene ningún tipo de opción para la conexión a la base de datos, solo el nombre de la conexión, para mantener la abstracción de la base de datos.
8.2.2. Sintaxis básica de los esquemas
En el archivo schema.yml
, la primera clave representa el nombre del modelo. Puedes definir varios modelos, cada uno con varias columnas. Siguiendo la sintaxis de YAML, las claves terminan con dos puntos (:
) y la estructura se define mediante la indentación con espacios, no con tabuladores.
Los modelos pueden definir atributos especiales, como por ejemplo el atributo tableName
(que es el nombre de la tabla que representa a este modelo dentro de la base de datos). Si no especificas el valor del atributo tableName
para un modelo, Doctrine lo genera automáticamente a partir de su nombre utilizando la técnica de los guiones bajos.
Nota La técnica de los guiones bajos convierte en minúsculas todas las letras y añade guiones bajos para separar las palabras. Por tanto, en el ejemplo anterior Articulo
y Comentario
se convierten en articulo
y comentario
.
Los modelos contienen columnas y el valor de las columnas se puede definir de dos formas diferentes:
- Si sólo se define un atributo, se considera que es el tipo de columna. Symfony entiende los tipos de columna habituales:
boolean
,integer
,float
,date
,string(tamaño)
,clob
(que se convierte, por ejemplo, en tipotext
en MySQL), etc. Para contenidos de texto de más de 256 caracteres, se utiliza el tipolongvarchar
, que no tiene tamaño definido (pero que no puede ser mayor que 65KB en MySQL). - Si necesitas definir otros atributos para la columna (como por ejemplo su valor por defecto, si es obligatorio o no, etc.), se indican como pares
clave: valor
. Esta sintaxis avanzada del esquema se describe más adelante en este capítulo.
Los modelos también pueden definir claves externas e índices de forma explícita. En la sección "Sintaxis avanzada del esquema" de este capítulo se detallan estos conceptos.