sábado, 18 de junio de 2011

Índices y llaves foráneas sobre atributos heredados en archivo de schema en doctrine 1.2

Aunque la herencia en doctrine ofrece grandes posibilidades y en muchos casos nos ahorrará bastante tiempo y código, no viene sin sus particularidades. Una de ellas se presenta cuando queremos definir un índice o una llave foránea en una clase usando atributos de la clase 'madre'. Así, si tenemos un modelo como el siguiente, el índice no funcionará:

ClaseMadre:
  connection: doctrine
  tableName: clase_madre
  columns:
     id:
      type: integer(4)
      primary: true
      autoincrement: true
    nombre:
      type: string(255)
      notnull: true
      default: false
    otro_atributo:
      type: string(255)
      notnull: true
      default: false

ClaseHija:
  connection: doctrine
  tableName: clase_hija
  inheritance:
    type:      concrete
    extends:   ClaseMadre
  columns:
    fecha_creacion:
      type: date
      notnull: true
  indexes:
    nombre_fecha_creacion_unique_index:
      fields: [nombre, fecha_creacion]
      type: unique

Lo más 'gracioso' es que no recibiremos un mensaje de error al construir el modelo y sólo nos daremos cuenta cuando hagamos pruebas. Para que el elemento sea creado correctamente, todos los atributos usados en su definición deben declararse en la clase 'hija'. De tal modo, el ejemplo anterior deberá corregirse así:

ClaseMadre:
  connection: doctrine
  tableName: clase_madre
  columns:
     id:
      type: integer(4)
      primary: true
      autoincrement: true
    otro_atributo:
      type: string(255)
      notnull: true
      default: false

ClaseHija:
  connection: doctrine
  tableName: clase_hija
  inheritance:
    type:      concrete
    extends:   ClaseMadre
  columns:
    nombre:
      type: string(255)
      notnull: true
      default: false
    fecha_creacion:
      type: date
      notnull: true
  indexes:
    nombre_fecha_creacion_unique_index:
      fields: [nombre, fecha_creacion]
      type: unique