Соотношение «многие ко многим» с атрибутами в refClass - PullRequest
2 голосов
/ 22 октября 2009

В настоящее время я разрабатываю веб-сайт, используя symfony (1.2) с Doctrine в качестве ORM.

У меня есть класс Dinner, класс Criteria и класс Mark.

  • Знак связан с ужином и Критерии, и имеет частные атрибуты, например DateOfMark, MarkValue и т. д.
  • Ужин и критерии могут иметь много Знаки (или нет).

Поскольку я использую Doctrine, я определяю эту модель в моем schema.yml, используя следующий код:

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

Проблема в том, что SQL, сгенерированный Doctrine, добавляет FOREIGN KEY CONSTRAINT на Mark.dinner_id к Dinner.id (что правильно) И добавляет FOREIGN KEY CONSTRAINT на Dinner.id к Mark.dinner_id (что на самом деле неверно, поскольку на обеде может быть много знаков).

Вопрос

Я что-то пропустил? Я делаю такое отношение между классами неправильно?

Спасибо.

1 Ответ

3 голосов
/ 23 октября 2009

Вы должны определить отношение как отношение «один ко многим». Попробуйте это (обратите внимание на «type: many», добавленное к определениям Dinner и Criteria):

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
...