Relación de muchos a muchos con atributos en refClass
-
05-07-2019 - |
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.
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