2012-04-19 23 views
1

ここで指摘したとおりです:Doctrine 2.1 - Map entity to multiple tables Doctrine2では、1つのオブジェクトを複数のテーブルにマッピングすることはできません。Doctrine2、 "継承された"テーブルのマッピング

私は現在、これに似たMySQLのDBのセットアップがありますように

base_entity: id, some_basic_data_columns 
state: id, state, entity_id (FK to base_entity.id), start_time, end_time, ... 

entity_one: id (FK to base_entity.id), some_specific_data 
entity_two: id (FK to base_entity.id), some_specific_data 
and so on... 

を、entity_xはbase_entityを「拡張」され、すべてのこれらのエンティティは、複数の状態を持つことができます。適切な外部キーを持つためには、別の状態テーブル(構造的に同じであるため、やりたくない)か、これを好きにするかのどちらかが必要です。

基本エンティティ自体は無意味です。idは、各子エンティティと複数の状態を結ぶことを許可するために、idフィールドだけで煮詰めることさえできます。

BaseEntityクラスは必要ありませんが、各子エンティティにgetStates()メソッドが必要です。もちろん抽象エンティティクラスを持っていても構いませんが、具体的なエンティティはそれを拡張します。他の1対1の関係をマップするようにマップすると、プロパティを持たないでしょう。

Doctrineは私が聞いている私は両方entity_oneとbase_entityテーブルにEntityOneをマップすることができません:

  1. をこの悪いデザインですか?私はこれを優雅に解決する他の方法を見落としていますか?私は他のDMBSに継承があることを知っていますが、例えば、PostgreSQLは、子に対して物理的なbase_entityが存在しなければ、base_entityへの参加を許可しません。

  2. 私は、コード側でこのような何かを行うことができます:

    class EntityOne { 
        // baseEntity as a property 
        private $_baseEntity; 
    
        // private getter for the base table 
        private getBaseEntity(); 
    
        // and getters like this for properties in the base table 
        public getStates(){ 
         return $this->getBaseEntity()->getStates(); 
        } 
    } 
    

    エンティティが外の世界へ(ベースと子から結合していない)単一のエンティティのように振る舞うだろうが、それはまだだろう。この方法これは、DBの設計の問題であり、私はからそれは完全に間違っていました:私は基本的に、私が求めていることである他のエンティティクラス

に接続する別のBaseEntityクラスと、すべての設定情報を書き込むことを要求スタート(そしてもし私がしたら、これは "ベスト"アプローチです)これはコードの問題であり、コードで回避する必要があります(もしそうなら、私のアプローチはOKですか、これに対処するより良い方法があります)。複数のテーブルマッピングを可能にするORMがありますか?

事前に感謝します。

答えて

2

クラステーブル継承(see Doctrine documentation about that)を使用してBaseEntityエンティティクラスを定義し、それを拡張するEntityOneおよびEntityTwoを作成できます。 BaseEntityクラスとStateエンティティクラスの間の関係を一対多の関連付けとして定義することができます。必要なものがわかったら、BaseEntityクラスに必要なgetState()メソッドを提供します。このような

何か:このため

/** 
* @Entity 
* @Table(name="base_entity") 
* @InheritanceType("JOINED") 
* @DiscriminatorColumn(name="entity_type", type="string") 
* @DiscriminatorMap({"entity_one"="EntityOne", "entity_two"="EntityTwo"}) 
*/ 
class BaseEntity { 

    /** 
    * @Id 
    * @Column(type="integer") 
    */ 
    protected $id; 

    /** 
    * @OneToMany(targetEntity="State", mappedBy="entity) 
    **/ 
    protected $states; 

    public function getStates() { 
     return $this->states; 
    } 

    ... 
} 

/** 
* @Entity 
* @Table(name="entity_one") 
*/ 
class EntityOne extends BaseEntity { 

    ... 
} 

/** 
* @Entity 
* @Table(name="entity_two") 
*/ 
class EntityTwo extends BaseEntity { 

    ... 
} 

/** 
* @Entity 
* @Table(name="state") 
*/ 
class State { 

    /** 
    * @ManyToOne(targetEntity="BaseEntity", inversedBy="states") 
    * @JoinColum(name="entity_id", referencedColumnName="id") 
    */ 
    protected $entity; 

    public function getEntity() { 
     return $this->entity; 
    } 

    ... 
} 
+0

おかげで、私は、ドキュメントのその部分を逃したと思います。とにかく、これは私が欲しいものを達成するでしょう。 – Pinetree

関連する問題