6

エンティティに単純なテーブル継承があります。次のように言います。

/** 
* @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")

これにより、次の例外が発生します。

[Semantical Error] line 0, col 406 near 'extendedProperty="xy"))': エラー: Class Models\Articles\BaseArticle には、location という名前のフィールドまたは関連付けがありません

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

4

2 に答える 2

0

これを解決するには、ゲッター/セッターを追加$extendedPropertyBaseArticleて使用し、エンティティでこのプロパティを効果的に非表示にしBaseArticle、ライフサイクル コールバックで NULLABLE を処理します。しかし、継承はほとんど無意味であるため、これは本当に悪い解決策です。

于 2012-08-15T09:41:03.193 に答える
0

できません。回避策は次のとおりです。

SELECT a
FROM BaseArticle a
WHERE
    a INSTANCE OF BaseAricle
    OR a.id IN (
        SELECT ea.id
        FROM ExtendedArticle ea
        WHERE ea.extendedProperty = "xy"
    )
于 2012-08-14T20:51:37.303 に答える