2012-12-12 2 views
7

eine andere Frage. Ich habe eine abstrakte BaseLog Entity, die die Verbindung zu meinem Benutzer hält. Zusätzlich habe ich 2 Entitäten (FooLog & BarLog) die BaseLog erweitern. Außerdem habe ich meine User Entity, die zwei Verknüpfungen zu Log aufnehmen soll. Eine für FooLog und eine für BarLog. Hier ist mein Problem. Ich erhalte Fehlermeldungen, weil ich nicht weiß, wie das BaseLog-Feld inversedBy beim Erweitern von Entity überschrieben wird. Kannst du mir bitte Helfen.doctrine2 Mapping überschreiben geerbt inversedBy Feld von MappedSuperclass

Weil ich denke, meine Erklärung ist nicht wirklich gut, hier die Einrichtung meiner Entitäten.

BaseLog

/** @ORM\MappedSuperclass */ 
abstract class BaseLog { 
    /** 
    * @ORM\ManyToOne(targetEntity="User", inversedBy="logs") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=true, onDelete="SET NULL") 
    * }) 
    */ 
    private $user; 
} 

FooLog

/** @ORM\Entity */ 
class FooLog extends BaseLog { 
    // Some additional fields 
} 

Barlog

/** @ORM\Entity */ 
class BarLog extends BaseLog { 
    // Some additional fields 
} 

Benutzer

/** @ORM\Entity */ 
class User { 
    /** 
    * @ORM\OneToMany(targetEntity="FooLog", mappedBy="user", cascade={"persist"}) 
    */ 
    private $fooLogs; 

    /** 
    * @ORM\OneToMany(targetEntity="BarLog", mappedBy="user", cascade={"persist"}) 
    */ 
    private $barLogs; 
} 

Wie habe ich BaseLog ‚s inversedBy in FooLog & Barlog zu überschreiben.

ich mehrere Mapping-Fehler auf diese ein: BaseLog

  • BaseLog: Der Verein BaseLog # Benutzer bezieht sich auf die inverse Seite Feld Benutzer # Protokolle, die nicht existiert.
  • FooLog: Die Zuordnung FooLog # user bezieht sich auf das inverse Seitenfeld User # logs, das nicht existiert.
  • BarLog: Die Zuordnung BarLog # Benutzer bezieht sich auf das inverse Seitenfeld Benutzer # Protokolle, die nicht vorhanden ist.
  • Benutzer: Die Zuordnungen Benutzer # fooLogs und FooLog # Benutzer sind inkonsistent miteinander.
  • Benutzer: Die Zuordnungen Benutzer # barLogs und BarLog # Benutzer sind inkonsistent miteinander.

Bitte helfen Sie mir, meine Zuordnung sortiert zu bekommen.

+0

Haben Sie das jemals gelöst? Ich stehe vor einer ähnlichen Situation. – hafichuk

+0

mögliches Duplikat von [Overriding inversedBy mapping in Doctrine 2 Vererbung] (http://stackoverflow.com/questions/22745653/overriding-inversedby-mapping-in-doctrine-2-inheritance) – PowerKiKi

+0

@hafichuk, es gibt eine doppelte Frage mit eine ausgezeichnete Antwort dort drüben: http://StackOverflow.com/A/22820964/37706 – PowerKiKi

Antwort

4

Ich hatte ähnliches Problem mit Single-Vererbung. Ich habe dies gelöst, indem ich in beiden Entity-Klassen (übergeordnet und geerbt) dieselbe Zuordnung definiert habe, aber einen anderen Namen habe. In Ihrem Fall können Sie dies versuchen:

/** @ORM\Entity */ 
class FooLog extends BaseLog { 
    /** 
    * @ORM\ManyToOne(targetEntity="User", inversedBy="foologs") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=true, onDelete="SET NULL") 
    * }) 
    */ 
    private $user; 
} 

und in der Klasse Barlog:

/** @ORM\Entity */ 
    class BarLog extends BaseLog { 
     /** 
     * @ORM\ManyToOne(targetEntity="User", inversedBy="barlogs") 
     * @ORM\JoinColumns({ 
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=true, onDelete="SET NULL") 
     * }) 
     */ 
     private $bar_user; 
    } 

Hinweis andere Namen ($ bar_user). Sie müssen auch Foologs und Barlogs Eigenschaften in der Benutzereinheit definieren. Dies beseitigt Fehler bei der Validierung von Doku- menten.

1

IIRC gab es keine gute Möglichkeit, Mappings in älteren Versionen von Doctrine zu überschreiben. In Doctrine> = 2.2 gibt es etwas, das association override genannt wird, vielleicht können Sie es benutzen.

BTW Warum möchten Sie nicht Assoziationen von der Basis zu konkreten Klassen verschieben und gültig inversedBy dann definieren?

+0

Ich möchte die Verbindung in BaseLog behalten, weil es jedes Mal das gleiche ist, außer dem Var-Namen in der Benutzerentität. –

+0

Ich habe in bereitgestellten Dokumentation gesucht, aber ich kann nicht finden, wie inversedBy Feld überschreiben. Irgendwelche anderen Vorschläge? –

3

Ich habe mit dem gleichen Problem mit Single Table Inheritance gekämpft. Soweit ich das beurteilen kann, gibt es keine Lösung.Auch wenn inversedBy als verpflichtend betrachtet wird, scheint es, als könnten Sie damit davonkommen, es zu ignorieren. Wie jedoch die Doctrine-Dokumente andeuten, verschlechtert sich die Leistung schnell.

@AssociationOverride hilft nicht, weil Sie keine Assoziationsdefinitionen, nur Datenbankspalteneigenschaften ändern können.

Ich habe eine Reihe von Optionen ausprobiert, von denen keine zufriedenstellend sind.

Update: Ich habe immer noch keine Lösung für diese Art von Fehlern gefunden, wenn app/console doctrine:schema:validate ausgeführt wird.

[Mapping] FAIL - The entity-class 'Acme\AcmeBundle\Entity\CourseLocation' mapping is invalid: 
* The field Acme\AcmeBundle\Entity\CourseLocation#facilitators is on the inverse side of a bi-directional relationship, but the specified mappedBy association on the target-entity Acme\AcmeBundle\Entity\CourseFacilitatorResponsibility#courseLocation does not contain the required 'inversedBy' attribute. 

In diesem Fall CourseFacilitatorResponsibility ist eine Unterklasse (mit Vererbung einzelner Tabelle) von CourseResponsibility. CourseLocation bezieht sich auf mehrere CourseResponsibility Entitäten. Ich denke, dass unidirektionale Assoziationen der einzige Weg sind.

+0

Ich lief auch auf dieses Problem. Gibt es jetzt eine Lösung? – edditor