2017-07-06 15 views
0

私は、それぞれが同じDBテーブルを使用して特定のデータを格納する2つの異なるエンティティによって拡張された基本クラス/エンティティを持っています。弁別子なしのDoctrine単一テーブル継承マップ

/** 
* @ORM\Table(name="my_table") 
* @ORM\Entity() 
* @ORM\InheritanceType("SINGLE_TABLE") 
* @ORM\HasLifecycleCallbacks() 
*/ 
abstract class Base { 

} 

/** 
* Subclass1 
* @ORM\Entity() 
*/ 
class Subclass1 extends Base { 

    /** 
    * @var propertyForSubClass1 
    */ 
    private $propertyForSubClass1; 
} 

/** 
* Subclass2 
* @ORM\Entity() 
*/ 
class Subclass2 extends Base { 

    /** 
    * @var propertyForSubClass2 
    */ 
    private $propertyForSubClass2; 
} 

SubClass1は、共通の列の数、プラス自体に特定の列を使用します。 SubClass2は同じものを実行しますが、一般的な列と、SubClass1で使用されていない特定の列を使用します。これは弁別マップの欠如に関連するさまざまな場所によると

Column not found: 1054 Unknown column 't0.dtype' in 'field list' 

:私は、表示されるエラーの原因となっているこの関係の問題を取得しています。ただし、ディスクリミネータ列が1つもない場合は、どのようにしてディスクリミネータマップを追加できますか。これは旧式のレトロフィットなので、カラムを追加することも可能ですが、これらを正しくマッピングする方法がないかと疑問に思っていました。

答えて

0

Doctrine Single Table Inheritanceを使用する場合は、Baseクラスに識別子の列を追加する必要があります。 documentationから:

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

Mapped SuperclassとしてBaseクラスを定義し、SubClass1SubClass2はそれを拡張しますです。しかし、データベース内の同じテーブルにマップされているので、サブクラスには2つの異なるエンティティ・マネージャを使用する必要があります。たとえば、あなたがconfig.ymlで、src/Entity/Dir2src/Entity/Dir1SubClass2SubClass1を置く場合:

doctrine: 
    orm: 
    default_entity_manager: manager1 
     ... 
     entity_managers: 
     manager1: 
      mappings: 
      AppBundle: 
       dir: Entity/Dir1 
     manager2: 
      mappings: 
      AppBundle: 
       dir: Entity/Dir2 

この方法は、データベース内の列を追加する必要はありませんが、あなたはあなたのコードここでどこにでも指定する必要がありますあなたが使用するマネージャー。

関連する問題