0

Я создал модель 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 не определен как уникальный, поскольку он должен быть слабым ключом.

ответ

0

Это может быть потому, что 2 ManyToOne отношения имеют ту же сущность, как targetEntity

AppBundle\Entity\Participate 
    manyToOne: 
    run: targetEntity: Run 
    comp: targetEntity: Run 

Комп должен иметь targrtEntity "Конкурс".

+0

Но это установит связь между участием и конкуренцией. Участвовать следует, однако, только в отношении Run, который имеет составной PK – exastion

+0

. Почему бы вам просто не создать промежуточную сущность, чтобы избежать ее использования дважды? – user3504263

+0

Я действительно не понимаю. Я добавил некоторую информацию в вопрос. – exastion

 Смежные вопросы

  • Нет связанных вопросов^_^