Pregunta

Actualmente estoy diseñando un sitio web, usando Symfony (1.2) con Doctrine como ORM.

Tengo una clase de cena, una clase de criterios y una clase de Mark.

  • Una marca está vinculada con una cena y una Criterios, y tiene atributos privados, como DateOfMark, MarkValue, etc.
  • La cena y los criterios pueden tener muchos Marcas (o ninguna).

Cuando uso Doctrine, defino este modelo en mi schema.yml, usando el siguiente código:

Dinner:
  columns:
    date: { type: timestamp, notnull: true }
    nb_presents: { type: integer, notnull: true }
  relations:
    Marks:
      class:    Criteria
      local:    dinner_id
      foreign:  criteria_id
      refClass: Mark

Criteria:
  columns:
    name: { type: string(50), notnull: true }
  relation:
    Marks:
      class:    Dinner
      local:    criteria_id
      foreign:  dinner_id
      refClass: Mark

Mark:
  columns:
    criteria_id: { type: integer, primary: true }
    dinner_id: { type: integer, primary: true }
    value: { type: integer, notnull: true }
  relations:
    Dinner:
      local:    dinner_id
      foreign:  id
    Criteria:
      local:    criteria_id
      foreign:  id

El problema es que el SQL generado por Doctrine agrega un FOREIGN KEY CONSTRAINT en Mark.dinner_id a Dinner.id (que es correcto) Y agrega un RESTRICCIÓN DE LLAVE EXTRANJERA en Dinner.id a Mark.dinner_id (que es realmente incorrecto , como una cena puede tener muchas marcas).

Pregunta

¿Me perdí algo? ¿Estoy haciendo mal este tipo de relación entre clases?

Gracias.

¿Fue útil?

Solución

Debe definir la relación como una relación de uno a varios. Pruebe esto (observe el " type: many " agregado a las definiciones de Cena y Criterios):

Dinner:
  columns:
    date: { type: timestamp, notnull: true }
    nb_presents: { type: integer, notnull: true }
  relations:
    Marks:
      class:    Criteria
      local:    dinner_id
      foreign:  criteria_id
      refClass: Mark
      type: many

Criteria:
  columns:
    name: { type: string(50), notnull: true }
 relation:
   Marks:
     class:    Dinner
     local:    criteria_id
     foreign:  dinner_id
     refClass: Mark
     type: many

Mark:
  columns:
    criteria_id: { type: integer, primary: true }
    dinner_id: { type: integer, primary: true }
    value: { type: integer, notnull: true }
  relations:
    Dinner:
      local:    dinner_id
      foreign:  id
    Criteria:
      local:    criteria_id
      foreign:  id
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top