Я создал модель ER для моего проекта и внедрил ее в php и добавил следующую информацию о маппинге:Я не могу сохранить объект, используя доктрину с составным первичным ключом, который включает в себя внешний ключ
AppBundle\Entity\Competition:
type: entity
id:
id:
type: integer
generator:
strategy: AUTO
fields:
name:
location:
date:
type: datetime
lifecycleCallbacks: { }
oneToMany:
runs:
targetEntity: Run
mappedBy: comp
cascade: [persist]
,
AppBundle\Entity\Run:
type: entity
id:
id:
type: integer
comp:
associationKey: true
fields:
name:
lifecycleCallbacks: { }
manyToOne:
comp:
targetEntity: Competition
inversedBy: runs
и
AppBundle\Entity\Participate:
type: entity
id:
athlete:
associationKey: true
run:
associationKey: true
comp:
associationKey: true
fields:
number:
type: integer
lifecycleCallbacks: { }
manyToOne:
athlete:
targetEntity: Athlete
cascade: [persist]
run:
targetEntity: Run
cascade: [persist]
comp:
targetEntity: Run
cascade: [persist]
EDIT: Run должен быть мы ak Entity, поэтому я думаю, что мне нужны 2 отношения для Run. Сначала для самого Запуска и второго для Конкурса, Run принадлежит.
Работа с конкурсом и Run работает как шарм, я могу сохраняться и за ними, но как только я пытаюсь сохранить объект из Участвуйте, я получаю следующее сообщение об ошибке:
Binding an entity with a composite primary key to a query is not supported. You should split the parameter into the explicit fields and bind them separately.
Я использую следующий код:
$em = $this->getDoctrine()->getManager();
$em->persist($participate);
$em->flush();
Я не знаю, что я должен сделать, чтобы решить эту проблему.
Благодаря
EDIT2:
Я просто понял, что теоретически, мне не нужно соотношение comp
в Participate
, как это уже в Run
и Run
объекты являются уникальными. Но если я хочу, чтобы обновить свою базу данных соответственно, доктрина дает мне следующий SQL:
ALTER TABLE Participate DROP FOREIGN KEY FK_8B9E3EEF4D0D3BCB;
DROP INDEX IDX_8B9E3EEF4D0D3BCB ON Participate;
ALTER TABLE Participate DROP PRIMARY KEY;
ALTER TABLE Participate DROP comp_id;
ALTER TABLE Participate ADD PRIMARY KEY (athlete_id, run_id);
Какой бы удалить внешний ключ Competition
в Participate
. Но run_id
не определен как уникальный, поскольку он должен быть слабым ключом.
Но это установит связь между участием и конкуренцией. Участвовать следует, однако, только в отношении Run, который имеет составной PK – exastion
. Почему бы вам просто не создать промежуточную сущность, чтобы избежать ее использования дважды? – user3504263
Я действительно не понимаю. Я добавил некоторую информацию в вопрос. – exastion