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 
*/ 
class Ground extends Service {} 


app/console doctrine:schema:validate

 
/** 
* @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 {} 

子供がちょうど「のサービス」テーブル、単一のテーブルを使用する必要があるものを生成しませんapp/console doctrine:schema:update --forceエラーが検出されなかったが、継承。サービスエンティティ定義が単に無視されるようです。

私はこのテーブルのSQLを手動で作成できますが、アプリケーションが大きくなり、ある時点で移行を使用する必要があります。

誰かが私をある方向に向けることができますか?ありがとう。 Doctrine 2 multiple level inheritance

編集:
私も第二レベル(Serviceエンティティの@ORM\InheritanceType("JOINED"))のクラステーブル継承を使用する場合、それはかなり作品を参照してください、複製を見つけましたが、何の答えは今のところ存在しない

よく参照:Doctrine2 Multiple level inheritance

答えて

4

あなたが達成しようとしていることは、純粋なマッピングでは不可能です。

のドキュメントClass Table InheritanceSingle Table Inheritance明確な状態:

@InheritanceType、@DiscriminatorColumnと@DiscriminatorMapが マッピングされたエンティティ 階層の一部である最上位クラスに指定する必要があります。

あなたが動的に継承型を変更loadClassMetaDataevent(すなわち、子エンティティのに注釈に基づく)へsubscriberを実装することによって、この作品を作ることができるかもしれません。

さらなるインスピレーションはthis articleにあります。

+0

ありがとうございます。これは基本的には「一番上のクラスで継承型を選んでそれに固執する」という意味です。今のところ、これは私のアプリケーションでは問題ありません... – virtualize