【问题标题】:Doctrine 2 - single table inheritance - access property of child entityDoctrine 2 - 单表继承 - 子实体的访问属性
【发布时间】:2025-12-12 05:15:02
【问题描述】:

我的实体有简单的表继承,比如:

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

这给了我以下异常:

[语义错误] line 0, col 406 near 'extendedProperty="xy"))': Error: Class Models\Articles\BaseArticle 没有名为 location 的字段或关联

那么问题来了,如何在对父类的查询中访问子类的属性?

【问题讨论】:

    标签: sql inheritance doctrine-orm


    【解决方案1】:

    你不能。这是一个解决方法:

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

    【讨论】:

    • 谢谢,但我真的不喜欢为简单的事情做如此低效的子查询。在 SQL 中,这确实是一项简单的任务,在我看来,学说需要对此提供一些原生支持。
    【解决方案2】:

    我通过将$extendedProperty 添加到BaseArticle 并使用getter/setter 有效地在我的BaseArticle 实体和生命周期回调中隐藏此属性来处理NULLABLE,从而解决了这个问题。但这确实是一个糟糕的解决方案,因为继承几乎没有意义。

    【讨论】: