Muitos-para-muitos relação com atributos em refClass
-
05-07-2019 - |
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 ??h2>
Eu perdi alguma coisa? Estou fazendo esse tipo de relação entre classes errado?
agradece.
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