6

これは私の基本/親エンティティであり、その子が独自のテーブルを使用するように設定されています。

/**
 * @ORM\エンティティ
 * @ORM\Table(name="layer_object")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"サービス"="サービス", "航空機"="航空機", ...})
 */
クラスLayerObject {}

航空機エンティティ。元気いっぱいの素朴な子

/**
 * @ORM\エンティティ
 * @ORM\Table(name="航空機")
 */
クラス Aircraft は LayerObject を拡張します

サービス エンティティ。それ自体が単一テーブルの継承を使用している複雑な子。

/**
 * @ORM\エンティティ
 * @ORM\Table(name="サービス")
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"ground"="Ground", "onboard"="Onboard"})
 */
class Service extends LayerObject {}

Service エンティティの子

/**
 * @ORM\エンティティ
 */
class Ground extends Service {}


app/console doctrine:schema:validateエラーは検出されませんが、単一テーブルの継承を使用する必要がある「サービス」テーブルが生成されませapp/console doctrine:schema:update --forceん。サービス エンティティの定義が単純に無視されているようです。

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

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

重複が見つかりましたが、これまでのところ回答はありません。参照: Doctrine 2 multiple level inheritance

編集:
第2レベル(エンティティ)にもクラステーブル継承を使用すると@ORM\InheritanceType("JOINED")Serviceかなりうまく機能します。参照: Doctrine2 複数レベルの継承

4

1 に答える 1

6

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

Class Table InheritanceSingle Table Inheritanceのドキュメントには、次のように明確に記載されています。

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

継承タイプを動的に変更するイベントへのサブスクライバーを実装することで、これを機能させることができる場合があります (つまり、子エンティティの注釈に基づいて)。loadClassMetaData

この記事では、さらなるインスピレーションを得ることができます。

于 2013-12-04T00:05:12.830 に答える