Ver índice de contenidos del libro

8.2. Esquema de base de datos de Symfony

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.

Estructura de tablas de la base de datos del blog

Figura 8.1 Estructura de tablas de la base de datos del blog

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 tipo text en MySQL), etc. Para contenidos de texto de más de 256 caracteres, se utiliza el tipo longvarchar, 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.