2016-08-01 22 views
0

ich versuche, eine OneToOne Beziehung mit Vererbung zu erstellen:Relation OneToOne mit symfony3/Lehre

abstract class A { } 
class A1 extends A { } 
class A2 extends A { } 

class F { 
    /** 
    * @ORM\OneToOne(?) 
    */ 
    private $object; // Could be of type A1 or A2 
} 

Ich mag würde, dies zu tun:

$f = $em->getRepository('MyBundle:F')->findExample(); 
$object = $f->getObject(); // Return instance of A1 or A2 

Welche Anmerkungen verwendet werden sollte?

+0

Warum verwenden Sie nicht zwei Objekte? 'private objectA1' für die Klasse A1 und' private objectA2' für die Klasse A2? – DOZ

+0

Ich suche nach einer besseren Möglichkeit, das zu tun. – Cliffe

Antwort

0

Wenn Sie eine unidirektionale Beziehung, was bedeutet, dass Sie nur eine F Einheit benötigen eine A Einheit enthält, dann können Sie eine unidirektionale Beziehung verwenden:

class F { 

    /** 
     * @ORM\OneToOne(targetEntity="A") 
     * @ORM\JoinColumn(name="id_a", referencedColumnName="id") 
     */ 
     private $a_object; 
} 

Beachten Sie, dass die Beziehung mit A hergestellt wurde, dass Mittel dass das Objekt von A1 oder A2 sein könnte. Wenn Sie eine bidirektionale müssen, sie sollten Sie eine Anmerkung in einer platzieren:

class A { 

    /** 
    * @OneToOne(targetEntity="F", mappedBy="a_object") 
    **/ 
    private $f_object; 
} 

Beachten Sie auch, dass Sie beide Anmerkungen zwischen F und A invers kann je, von denen Sie als Haupt Seite betrachten. Überprüfen Sie diese links und diese links für weitere Informationen.

Ich hoffe, dies hilft Ihnen.

+0

Genau, aber A muss auch eine Entität sein. Er sollte eine Tabellenvererbung verwenden. – Alsatian

+0

Ja, A sollte eine Entität sein, aber als abstrakt definiert, was bedeutet, dass das Objekt A1 oder A2 sein muss. Ich sehe damit kein Problem. – abdiel

+0

Sie können sich nur auf ein verwandtes Objekt verlassen, wenn die ID-Spalte zwischen A1 und A2 geteilt ist (Klassentabellenvererbung oder Vererbung einzelner Tabellen). – Alsatian