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.

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top