Relazione molti-a-molti con attributi in refClass
-
05-07-2019 - |
Domanda
Attualmente sto progettando un sito Web, usando symfony (1.2) con Doctrine come ORM.
Ho una lezione per la cena, una per i criteri e una per i voti.
- Un segno è collegato con una cena e un Criteri e ha attributi privati, come DateOfMark, MarkValue, ecc.
- Cena e criteri possono avere molti Segni (o nessuno).
Mentre uso Doctrine, definisco questo modello nel mio schema.yml, usando il seguente codice:
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
Il problema è che l'SQL generato da Doctrine, aggiunge un STRANIERO CHIAVE ESTERO
su Mark.dinner_id
a Dinner.id
(che è corretto) AND aggiunge un VINCITORE CHIAVE ESTERO
su Dinner.id
a Mark.dinner_id
(che è davvero errato , poiché una cena potrebbe avere molti segni).
Domanda
Mi sono perso qualcosa? Sto sbagliando questo tipo di relazione tra le classi?
Grazie.
Soluzione
Devi definire la relazione come una relazione uno-a-molti. Prova questo (nota il tipo "quot: many" aggiunto alle definizioni di cena e criteri):
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