Pergunta

Atualmente estou projetando um site, usando symfony (1,2) com Doutrina como um ORM.

Eu tenho uma classe jantar, uma classe Criteria, e uma classe de Mark.

  • A Mark está ligado com um jantar e uma Critérios, e tem atributos particulares, como DateOfMark, MarkValue, etc.
  • Jantar e Critérios pode ter muitos Marcas (ou nenhum).

Como eu uso Doutrina, eu defino este modelo em minha schema.yml, usando o seguinte 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

O problema é que o SQL gerado pelo Doctrine, ele adiciona um FOREIGN KEY CONSTRAINT em Mark.dinner_id para Dinner.id (que é correto) E acrescenta um FOREIGN KEY CONSTRAINT em Dinner.id para Mark.dinner_id (que é realmente incorreta, como um Jantar pode ter muitos Marks).

Pergunta

Eu perdi alguma coisa? Estou fazendo esse tipo de relação entre classes errado?

agradece.

Foi útil?

Solução

Você precisa definir a relação como sendo uma relação de um-para-muitos. Tente isto (note o "tipo: muitos" adicionados às definições jantar e Critérios):

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top