2014-01-16 6 views
7

私は、半ダースの主要なエンティティタイプを含むsymfony2プロジェクトを持っています。私はDoctrineを使用しています。symfony2 - 基本エンティティクラスを拡張するか、エンティティを無関係にしますか?

これらのエンティティには、creatorId、Created、Updated、Status、およびTitleなど、いくつかの同一フィールドがあります。現時点では、各エンティティは別々に定義されています - もちろん、基本コード(およびdbフィールドも同様)の複製がたくさんあります。

私はSymfony2のを学ぶように私はOOPを学んでいますので、私はここに手探りんだけど、私の質問はこれです:

は、それが自己完結型クラスとして各エンティティを維持するためのベストプラクティスを検討しますか?または、共有プロパティの新しい基本クラスを作成し、それから他のエンティティに基本エンティティを拡張させることをお勧めしますか?

ボーナス質問:

そして、それは親クラスから継承するエンティティを構築するために、実際に優れているならば、私は漠然と二つの選択肢可視化することができます。

1)親クラスが完全にマッピングされた教義の実体でありますデータベース内に独自のテーブルがあり、それを「ノード」と呼ぶことにします。したがって、子エンティティを呼び出すと、ノードテーブルと子コンテンツタイプエンティティテーブルの間に追加の結合が常に必要になります。

2)親クラスは抽象クラス(?)で、他のエンティティの共有プロパティを定義しますが、実際のデータベースが存在しません。各子エンティティは共有プロパティを別々に実装しているため、DB構造は現在の設定と同じですが、エンティティを定義するときにはコードの重複が少なくなります。

私は主に基本的なエンティティを拡張している子エンティティか、別のエンティティのみをアドバイスしています。ヒントは大歓迎ですが、誰もが最高の実装を説明することを期待していません。

答えて

9

私は抽象基本エンティティクラスを作成し、他のエンティティにそれを拡張させます。たとえば:

abstract class AbstractEntity 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    */ 
    protected $id; 

    /** 
    * @var \datetime $created 
    * 
    * @ORM\Column(type="datetime") 
    */ 
    private $created; 

    /** 
    * @var \datetime $updated 
    * 
    * @ORM\Column(type="datetime") 
    */ 
    private $updated; 

... 

} 

次に、あなたのエンティティのそれぞれは、この拡張することができます。

class SomeEntity extends AbstractEntity 
{ 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="some_name", type="string", length=255) 
    */ 
    protected $something 
} 

オプション2は正しいものである - データベース抽象クラスのための任意の具体的なテーブルは存在しないでしょう。

基本クラスを拡張する必要がある場合は、他の抽象クラスを引き続き使用できます。たとえば、AbstractVehicleエンティティは基本エンティティを拡張します。たとえば、AbstractVehicle(Car、Vanなど)のすべてのサブエンティティを同じ表(たとえば「車両」)に入れたい場合は、Discriminator Mapのようなものを使用できます。 This article on Inheritence Mappingは役に立つ読書かもしれません。

+1

鮮明な答えと今後の研究に役立つ貴重な情報をいただき、ありがとうございます。単一テーブル継承とクラステーブル継承は、私が掴んでいたDoctrineseの言葉とまったく同じです。 –

関連する問題