0

ich ein ER-Modell für mein Projekt erstellt und implementiert sie in PHP und addierte die folgenden maaping Informationen:Ich bin nicht in der Lage eines Objekt, mit Lehre zu beharren, dass einen zusammengesetzten Primärschlüssel hat, die einen Fremdschlüssel enthält

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 

und

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 sollte man sein ak Entität, also denke ich, dass ich die 2 Relationen zu Run brauche. Zuerst für den Lauf selbst und zweitens für den Wettbewerb gehört der Lauf dazu.

mit Wettbewerb Arbeiten und Run wirkt wie ein Zauber, ich kann sie bestehen bleiben und holen, aber sobald ich versuche, ein Objekt von Teilnehmen bestehen bleiben, bekomme ich folgende Fehlermeldung:

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.

Ich benutze der folgende Code:

$em = $this->getDoctrine()->getManager(); 
$em->persist($participate); 
$em->flush(); 

Ich weiß nicht, was ich tun soll, um dieses Problem zu beheben.

Dank

EDIT2:

Ich verstehe nur, dass theoretisch, ich die Beziehung nicht brauche comp in Participate, wie es bereits in Run ist und die Run Objekte sind einzigartig. Aber wenn ich möchte, dass meine Datenbank entsprechend aktualisieren, gibt Lehre mir die folgende 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); 

die den Fremdschlüssel zu Competition in Participate entfernen würden. Aber run_id ist nicht als eindeutig definiert, weil es ein schwacher Schlüssel sein sollte.

Antwort

0

Es könnte sein, weil 2 manyToOne Beziehungen die gleiche Einheit wie targetEntity

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

Comp die targrtEntity "Competition" haben sollte.

+0

Aber dies würde eine Beziehung zwischen Teilnehmen und Wettbewerb machen. Teilnehmen sollte jedoch nur in Bezug auf Run, die eine zusammengesetzte PK hat. – exastion

+0

Warum also nicht einfach eine zwischengeschaltete Entität erstellen, um sie nicht zweimal zu verwenden? – user3504263

+0

Ich verstehe das nicht wirklich. Ich habe einige Informationen in der Frage hinzugefügt. – exastion