5

這是我的基礎/父母實體,因此它的孩子正在使用他們自己的表格。單個表繼承實體是否可以擴展一個類表繼承實體?

 
/** 
* @ORM\Entity 
* @ORM\Table(name="layer_object") 
* @ORM\InheritanceType("JOINED") 
* @ORM\DiscriminatorColumn(name="discr", type="string") 
* @ORM\DiscriminatorMap({"service"="Service", "aircraft"="Aircraft", ...}) 
*/ 
class LayerObject {} 

飛機實體。一個做得好的簡單小孩

 
/** 
* @ORM\Entity 
* @ORM\Table(name="aircraft") 
*/ 
class Aircraft extends LayerObject 

服務實體。一個複雜的孩子,它本身正在使用單個表繼承。

 
/** 
* @ORM\Entity 
* @ORM\Table(name="service") 
* @ORM\InheritanceType("SINGLE_TABLE") 
* @ORM\DiscriminatorColumn(name="discr", type="string") 
* @ORM\DiscriminatorMap({"ground"="Ground", "onboard"="Onboard"}) 
*/ 
class Service extends LayerObject {} 

服務實體

 
/** 
* @ORM\Entity 
*/ 
class Ground extends Service {} 


app/console doctrine:schema:validate的孩子沒有發現錯誤,但是app/console doctrine:schema:update --force只是不會產生「服務」表中,應使用單獨的表中的一個繼承。看起來像服務實體定義簡單地被忽略。

當然,我可以手工創建這個表的SQL,但應用程序將會增長,並且在某些時候我需要使用遷移。

任何人都可以在某個方向指向我嗎?謝謝。

發現重複的,但目前還沒有答案爲止,請參閱:Doctrine 2 multiple level inheritance

編輯:
當我使用類表繼承了(爲Service實體@ORM\InheritanceType("JOINED"))第2級太它工作得好。請參閱:Doctrine2 Multiple level inheritance

回答

4

你試圖實現的是純粹的映射不可能實現的。

用於文檔Class Table InheritanceSingle Table Inheritance清楚闡明:

的@InheritanceType,@DiscriminatorColumn和@DiscriminatorMap必須 可以在最頂層的即映射的實體 層次結構的一部分指定。

您可能能夠通過實現subscriberloadClassMetaDataevent動態改變繼承型(即基於註解子實體),以使這項工作。

一些進一步的靈感可以在this article找到。

+0

非常感謝。這基本上意味着:'在最頂層的類中選擇一種繼承類型並堅持下去'。現在這對我的應用程序來說很好... – virtualize