Ver índice de contenidos del libro

8.7. Sintaxis extendida del esquema

Un archivo schema.yml puede ser tan sencillo como el mostrado en el listado 8-3. Sin embargo, los modelos relacionales suelen ser complejos. Este es el motivo por el que existe una sintaxis extendida del esquema para que se pueda utilizar en cualquier caso.

8.7.1. Atributos

Se pueden definir atributos específicos para las conexiones y las tablas, tal y como se muestra en el listado 8-24. Estas opciones se establecen bajo la clave _attributes.

Listado 8-24 - Atributos de los modelos

Articulo:
  attributes:
    export: tables
    validate: none

La opción export controla el código SQL que se exporta a la base de datos cuando se crean las tablas de ese modelo. El valor tables indica que solo se exporta la estructura de la tabla y no sus claves externas, índices, etc.

Las tablas que guardan contenidos en varios idiomas (es decir, diferentes versiones de un mismo contenido, almacenadas en una tabla relacionada para la internacionalización) utilizan el comportamiento I18n (explicado detalladamente en el Capítulo 13), tal y como se muestra en el listado 8-25.

Listado 8-25 - Comportamiento I18n

Articulo:
  actAs:
    I18n:
      fields: [titulo, contenido]

8.7.2. Detalles de las columnas

La sintaxis básica permite definir el tipo de cada columna a partir de los tipos predefinidos, tal y como muestra el listado 8-26.

Listado 8-26 - Atributos básicos de columna

Articulo:
  columnas:
    titulo: string(50)  # especifica el tipo y su tamaño

Para cada columna se pueden definir muchas más características. En tal caso, se utiliza un array asociativo para indicar todas las opciones de la columna, tal y como muestra el listado 8-27.

Listado 8-27 - Atributos avanzados de columna

Articulo:
  columns:
    id:       { type: integer, notnull: true, primary: true, autoincrement: true }
    nombre:   { type: string(50), default: anónimo }
    grupo_id: { type: integer }

Los parámetros de las columnas son los siguientes:

  • type: Tipo de columna. Se puede elegir entre boolean, integer, double, float, decimal, string(tamano), date, time, timestamp, blob y clob.
  • notnull: valor booleano. Si vale true la columna debe tener obligatoriamente un valor.
  • length: el tamaño o longitud del campo (sólo para los tipos de datos que lo soportan).
  • scale: número de decimales a utilizar para el tipo de dato decimal (obligatorio indicar también el valor de size)
  • default: el valor por defecto.
  • primary: valor booleano. Si vale true indica que es una clave primaria.
  • autoincrement: valor booleano. Si se indica true para las columnas de tipo integer, su valor se auto-incrementará.
  • sequence: el nombre de la secuencia para las bases de datos que utilizan secuencias para las columnas autoincrement (por ejemplo PostgreSQL y Oracle).
  • unique: valor booleano. Si su valor es true, todos los valores de esta columna son únicos.

8.7.3. Relaciones

Las relaciones creadas con claves externas o foráneas se indican mediante la clave relations del modelo. El esquema del listado 8-28 crea una clave externa en la columna usuario_id, que hace referencia a la columna id de la tabla blog_usuario.

Listado 8-28 - Sintaxis alternativa para las claves externas

Articulo:
  actAs: [Timestampable]
  tableName: blog_articulo
  columns:
    id:
      type: integer
      primary: true
      autoincrement: true
    titulo:   string(255)
    contenido: clob
    usuario_id: integer
  relations:
    Usuario:
      onDelete: CASCADE
      foreignAlias: Articulos

8.7.4. Índices

Si quieres añadir índices en un modelo, utiliza la clave indexes:. Si el índice debe ser único, añade la sintaxis type: unique. Las columnas de texto que requieren un tamaño de índice lo indican entre paréntesis, de la misma forma que se indica el tamaño de la columna. El listado 8-30 muestra la sintaxis alternativa para los índices.

Listado 8-30 - Sintaxis alternativa para los índices y los índices únicos

Articulo:
  actAs: [Timestampable]
  tableName: blog_articulo
  columns:
    id:
      type: integer
      primary: true
      autoincrement: true
    titulo:   string(255)
    contenido: clob
    usuario_id: integer
  relations:
    Usuario:
      onDelete: CASCADE
      foreignAlias: Articulos
  indexes:
    mi_indice:
      fields:
        titulo:
          length: 10
        usuario_id: []
    otro_indice:
      type: unique
      fields:
        created_at

8.7.5. Tablas i18n

Symfony permite internacionalizar los contenidos mediante tablas relacionadas. De esta forma, cuando se dispone de contenido que debe ser internacionalizado, se guarda en dos tablas distintas: la primera contiene las columnas invariantes y la otra contiene las columnas que permiten la internacionalización.

Listado 8-33 - Mecanismo i18n explícito

DbGroup:
  actAs:
    I18n:
      fields: [nombre]
  columns:
    nombre: string(50)

8.7.6. Comportamientos

Los comportamientos son plugins que modifican el modelo de datos para añadir nuevas funcionalidades a las clases de Doctrine. El capítulo 17 explica los comportamientos en detalle. Puedes definir los comportamientos directamente en el esquema, indicando en cada tabla los comportamientos utilizados y sus atributos bajo la clave actAs. El listado 8-34 muestra un ejemplo que extiende la clase Articulo con el comportamiento llamado Sluggable.

Listado 8-34 - Declarando los comportamientos

Articulo:
  actAs: [Sluggable]
  # ...