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 entreboolean
,integer
,double
,float
,decimal
,string(tamano)
,date
,time
,timestamp
,blob
yclob
.notnull
: valor booleano. Si valetrue
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 datodecimal
(obligatorio indicar también el valor desize
)default
: el valor por defecto.primary
: valor booleano. Si valetrue
indica que es una clave primaria.autoincrement
: valor booleano. Si se indicatrue
para las columnas de tipointeger
, su valor se auto-incrementará.sequence
: el nombre de la secuencia para las bases de datos que utilizan secuencias para las columnasautoincrement
(por ejemplo PostgreSQL y Oracle).unique
: valor booleano. Si su valor estrue
, 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]
# ...