Doctrine orm 单表继承中的外键

Doctrine orm 单表继承中的外键,doctrine-orm,Doctrine Orm,我试图创建一个简单的多态属性表,它可以存储不同类型对象的键值对。使用单表继承,这是我当前的配置: /** * @Entity @Table(name="attributes") * @InheritanceType("SINGLE_TABLE") * @DiscriminatorColumn(name="subject", type="string") * @DiscriminatorMap({"page" = "PageAttribute", "product" = "ProductA

我试图创建一个简单的多态属性表,它可以存储不同类型对象的键值对。使用单表继承,这是我当前的配置:

/**
 * @Entity @Table(name="attributes")
 * @InheritanceType("SINGLE_TABLE")
 * @DiscriminatorColumn(name="subject", type="string")
 * @DiscriminatorMap({"page" = "PageAttribute", "product" = "ProductAttribute"})
 */
class PageAttribute
{
    /**
     * @ManyToOne(targetEntity="Page", inversedBy="attributes")
     * @JoinColumn(name="subject_id", referencedColumnName="id")
     */
    private $page;
}

/**
 * @Entity @Table(name="attributes")
 */
class ProductAttribute extends PageAttribute
{
    /**
     * @ManyToOne(targetEntity="Product", inversedBy="attributes")
     * @JoinColumn(name="subject_id", referencedColumnName="id")
     */
    private $product;
}
问题是,当加载此模式时,将使用链接到pages表的外键约束创建subject_id列


是否有方法防止此约束,以便可以将subject_id用于所有外键?否则,我必须为每种类型的对象设置一个列,这是我试图避免的。

我也有同样的问题。以下是我解决问题的方法:

/**
 * @Entity @Table(name="attributes")
 */
class ProductAttribute extends PageAttribute
{
    public static function getSubject() {
        return 'product';
    } 
    /**
     * @ManyToOne(targetEntity="Product", inversedBy="attributes")
     * @JoinColumn(name="product_id", referencedColumnName="id")
     */
    private $product;
}
换句话说,不是使用subject_id引用所有实体,而是为每种类型的实体使用单独的联接列。然后可以使用静态函数获取“subject”列的参数名

例如:

$subject = $genericPageAttribute->{$genericPageAttribute::getSubject()};
在这种情况下,将返回“Product”的实例

为了使这个解决方案更好,我建议编写一个所有“主题”都可以实现的接口

我不确定这是否能涵盖所有情况,但到目前为止,它似乎对我来说效果不错

让我知道它是如何为你工作(或不工作)的