2012-08-14 16 views
6

私は、私のentitesに単純なテーブルの継承を持っているようsomehingを言う:私はすべての記事タイプ間でクエリを実行する必要がありドクトリン2 - 単一テーブル継承 - 子エンティティのアクセスプロパティ

/** 
* @InheritanceType("SINGLE_TABLE") 
* @DiscriminatorColumn(name="type", type="string") 
* @DiscriminatorMap({"base"="BaseArticle", "extended"="ExtendedArticle"}) 
*/   
class BaseArticle extends \Models\BaseModel{ 
    ... 
} 
class ExtendedArticle extends BaseArticle{ 
    /** 
    * @column(type="string") 
    */ 
    protected $extendedProperty; 
} 

が、いくつかの種類ですなわち、それは、拡張ExtendedArticleであり、いくつかのプロパティでクエリを制限:

SELECT a FROM BaseArticle a WHERE (a INSTANCE OF BaseAricle) OR (a INSTANCE OF ExtendedArticle AND a.extendedProperty = "xy") 

WICHは、例外をfolowing私を与える:

[Semantical Error] line 0, col 406 near 'extendedProperty="xy"))': Error: Class Models\Articles\BaseArticle has no field or association named location 

質問は、親クラスへのクエリで子のプロパティにアクセスする方法ですか?

答えて

0

できません。私はBaseArticle$extendedPropertyを追加し、効果的にNULLABLEを処理するために、私のBaseArticleエンティティとライフサイクルコールバックでこのプロパティを非表示にするゲッター/セッターを使用してこれを解決した

SELECT a 
FROM BaseArticle a 
WHERE 
    a INSTANCE OF BaseAricle 
    OR a.id IN (
     SELECT ea.id 
     FROM ExtendedArticle ea 
     WHERE ea.extendedProperty = "xy" 
    ) 
+0

本当にありがたいですが、単純なことのためにこのような非効率的なサブクエリを行うという考えは本当に好きではありません。 SQLでは、これは本当に簡単な作業ですが、教義にはこれに対するネイティブなサポートが必要だと私には思われます。 – DaveLister

0

:ここでは、回避策です。しかし、これは継承がほとんど無意味なので、本当に悪い解決策です。

関連する問題