2016-04-08 4 views
4

Ich versuche, eine Klasse zu erweitern als Lehre Einheit verwendet, aber aus irgendeinem Grunde halte ich den Fehler bekommen:Erweiterung eine Entity-Klasse in der Lehre

There is no column with name 'location_id' on table 'admin_subdivisions'

Wenn ich verlängern sagen, dass ich an der php bedeuten level NICHT die Datenbankebene. Ich möchte einfach eine andere Tabelle mit einer zusätzlichen Spalte erstellen. Ich habe mehrere Einheiten, die die folgende abstrakte Klasse erweitern

abstract class LocationProxy 
{ 
    /** 
    * @ORM\Id 
    * @ORM\OneToOne(targetEntity="Location", cascade={"ALL"}, fetch="LAZY") 
    * @ORM\JoinColumn(name="location_id", referencedColumnName="location_id", nullable=false) 
    * 
    * @var Location 
    */ 
    protected $location; 
} 

Keine dieser Second-Level-Klassen gibt mir irgendwelche Probleme. Nun möchte ich diese zweite Ebene Klasse

/** 
* @ORM\Entity() 
* @ORM\Table(name="admin_divisions") 
*/ 
class AdminDivision extends LocationProxy 
{ 
} 

mit diesem

/** 
* @ORM\Entity() 
* @ORM\Table(name="admin_subdivisions") 
*/ 
class AdminSubDivision extends AdminDivision 
{ 
} 

verlängern, aber es den Fehler erzeugt. Kann jemand darauf hinweisen, was ich falsch mache?

hier ist die Lage Klassendefinition

/** 
* @ORM\Entity() 
* @ORM\Table(name="locations") 
*/ 
class Location 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(name="location_id", type="integer", options={"unsigned"=true}) 
    * 
    * @var int 
    */ 
    private $id; 
} 
+0

Ist die 'referencedColumnName' Ihrer' joinColumn' der Primärschlüssel der Location Einheit ist? – chalasr

+0

@chalasr, Ja, und fügte es dem op hinzu. Ich habe es geschafft, indem ich eine extra 'abstrakte Admin'-Klasse erstellt habe, und dann sowohl' AdminDivision' als auch 'AdminSubDivision' daraus ausgebreitet habe. Aber ich würde immer noch gerne wissen, warum der obige Code nicht funktioniert. – Twifty

+1

Entschuldigung, aber ich sehe nicht, warum, hoffe jemand anders kann es geben, Wenn niemand, ich werde es auf meiner Seite versuchen. Eine andere Problemumgehung wäre, ein Merkmal zu verwenden und es in Ihren zwei Klassen zu verwenden, und BTW macht die Klassen in der Lage, ein anderes zu erweitern, während die Eigenschaft "$ location" beibehalten wird. – chalasr

Antwort

0

Sie die Vererbungstyp angeben müssen, damit Lehre weiß, wie die Tabellen für die Unterklassen zu bauen: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html#mapped-superclasses

In Sie Sie die case müssen folgende Anmerkungen zu Ihrer abstrakten LocationProxy Klasse:

@ORM\Entity 
@ORM\InheritanceType("JOINED") 
@ORM\DiscriminatorColumn(name="discr", type="string") 

Oder einen anderen Vererbungstyp wählt

So ist die ganze Klasse wird wie folgt aussehen:

/** 
* @ORM\Entity 
* @ORM\InheritanceType("JOINED") 
* @ORM\DiscriminatorColumn(name="discr", type="string") 
*/ 
abstract class LocationProxy { 
    /** 
    * @ORM\Id 
    * @ORM\OneToOne(targetEntity="De\Gregblog\Receipts\Location", cascade={"ALL"}, fetch="LAZY") 
    * @ORM\JoinColumn(name="location_id", referencedColumnName="location_id", nullable=false) 
    * 
    * @var Location 
    */ 
    protected $location; 
}