Relation plusieurs à plusieurs avec les attributs dans refClass
-
05-07-2019 - |
Question
Je suis en train de concevoir un site Web, utilisant symfony (1.2) avec Doctrine en tant qu'ORM.
J'ai une classe de dîner, une classe de critères et une classe de marque.
- Une marque est liée à un dîner et à un Critères, et a des attributs privés, comme DateOfMark, MarkValue, etc.
- Le dîner et les critères peuvent en avoir beaucoup Marques (ou aucune).
Lorsque j'utilise Doctrine, je définis ce modèle dans mon fichier schema.yml, à l'aide du code suivant:
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
Le problème est que le code SQL généré par Doctrine ajoute un FOREIGN KEY CONSTRAINT
sur Mark.dinner_id
à Dinner.id
(qui est correct) AND ajoute un CONSTRAINT DE TOUCHE ÉTRANGÈRE
le Dinner.id
à Mark.dinner_id
(ce qui est vraiment incorrect , comme un dîner pourrait avoir beaucoup de marques).
Question
Ai-je oublié quelque chose? Est-ce que je fais ce genre de relation entre les classes mal?
Merci.
La solution
Vous devez définir la relation comme étant une relation un-à-plusieurs. Essayez ceci (notez le "type: beaucoup" ajouté aux définitions du dîner et des critères):
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