2011-02-19 21 views
5

私は2つのエンティティ - ニュースとページを持っています。 定義は次のようになります。Doctrine 2 - クラステーブル継承、種類によって選択

 
/** 
* Description of Page 
* @Entity 
* @InheritanceType("JOINED") 
* @DiscriminatorColumn(name="type", type="string") 
* @DiscriminatorMap({ 
* "news" = "News" , 
* "page" = "Page"}) 
* 
* @table(
* name="pages" 
*) 
*/ 
class Page extends BaseEntity {...} 
class News extends Page {...} 

私が知っている、唯一の「ニュース」エンティティを選択する方法 - 簡単なSELECT ... FROM News nを。

ページクラスに直接マップされる「ページ」エンティティのみを選択する方法はありますか?あるいは、私はこのためにページを拡張するいくつかの追加のエンティティを作成しなければなりませんか?

+0

あなたは何をしようとしていますか?クラステーブルの継承を適切な方法で使用するかどうかはわかりません。 –

+0

私はタイトル、テキスト、著者などのプロパティを持つ基本的なエンティティのページを持っています。ニュースはサマリー、コメントの関連付けなどのいくつかの追加のプロパティでそれを拡張します... おそらく単一のテーブルの継承を使用してこれを行うことができます結果が1つの大きなテーブルであるため、正しいアプローチだとは思わない。 –

+0

私は何かが恋しいですか? ...なぜあなたは 'SELECT * FROM Page ...'を問い合わせることができますか? – Cobby

答えて

0

ソリューションは、私はそうのように、ルートエンティティRepositoryクラスのスイッチャーを作成することです:

class PageRepository extends EntityRepository 
{ 
    protected $_switchEntityNameSave = null; 

    /** 
    * @param type $fqcn 
    */ 
    protected function _swapEntityDiscriminator($fqcn = null){ 
    if(isset($fqcn)){ 
     $this->_switchEntityNameSave = $this->_entityName; 
     $this->_entityName = $fqcn; 
    } else { 
     $this->_entityName = $this->_switchEntityNameSave; 
     unset($this->_switchEntityNameSave); 
    } 
    } 

    // ... AND TO USE... 

    public function findSomeStuff() 
    { 
    $this->_swapEntityDiscriminator(News::getFqcn()); 
    // The query, the result in a variable, $q for example 
    $this->_swapEntityDiscriminator(); 
    return $q->getQuery(); 
    } 

} 

その後、親クラッセでは、私はゲッターgetFqcn()を行います次のようにしてください:

abstract class BaseEntity { 
    /** 
    * Get fqcn 
    * 
    * Fully Qualified Class Name 
    * 
    * @return string 
    */ 
    public static function getFqcn() 
    { 
     return get_called_class(); 
    } 
    // ... 
} 

これは、レイトスタティックバインディング機能を使用して、私に具体的なオブジェクトの完全なクラス名を与えます( NewsまたはPage)。

抽象化してインスタンス化しないようにします。

私はまた、具体的なクラス、いくつかの定数に追加

:私だけのタイプのいずれかに特化したファインダを作成することができます

class News extends Page { 
    const HUMAN_READABLE = "News"; 
    const DISCRIMINATOR = "news"; // SAME as your @DiscriminatorMap() Annotation. 

} 

そのように、私のRepository