学说实体继承


Doctrine entity inheritance

我有一个实体,我想将其用作其他实体的基类(目前未知),我需要在基实体中存储关系:

/**
 * @ORM'Entity
 * @ORM'Table(name="CMS_content")
 */
class BaseContent {
    /**
     * @ORM'ManyToOne(targetEntity="BaseContent")
     * @ORM'JoinColumn(name="parent", referencedColumnName="id", unique=false)
     */
    protected $parent;
    /**
     * @ORM'ManyToOne(targetEntity="ContentType")
     * @ORM'JoinColumn(name="content_type", referencedColumnName="id", unique=false)
     */
    protected $contentType;
    ...
};
/**
 * @ORM'Entity
 * @ORM'Table(name="CMS_whateverSpecializedContent")
 */
class WhateverSpecializedContent extends BaseContent {};

我不能使用@ORM'InheritanceType("JOINED")因为我希望以后能够在不接触基类的情况下创建任意数量的子类。我还需要将基类放在单独的数据库表中,以便关系有意义。

我还有哪些其他选择来管理这种结构?

我没有使用实体继承,而是使用了委托设计模式。ContentBaseContent 都实现了通用接口,BaseContent将功能委托给联接的内容实体。

现在,此 BaseContent 的每个子类都将有一个联接的内容实体,并且可以在需要 IContent 的地方使用。

interface IContent {...}
/**
 * @ORM'Entity
 * @ORM'Table(name="CMS_content")
 */
class Content implements IContent {
    /**
     * @ORM'ManyToOne(targetEntity="BaseContent")
     * @ORM'JoinColumn(name="parent", referencedColumnName="id", unique=false)
     */
    protected $parent;
    /**
     * @ORM'ManyToOne(targetEntity="ContentType")
     * @ORM'JoinColumn(name="content_type", referencedColumnName="id", unique=false)
     */
    protected $contentType;
    ...
};
/**
 * @ORM'Entity
 * @ORM'Table(name="CMS_whateverSpecializedContent")
 */
class WhateverSpecializedContent extends BaseContent {};
/**
 * @ORM'MappedSuperclass
 */
abstract class BaseContent implements IContent {
    /**
     * @ORM'OneToOne(targetEntity="Content", cascade={"persist", "merge", "remove"})
     * @ORM'JoinColumn(name="content", referencedColumnName="id", unique=false)
     */
    private $content;
    public function implementedMethod() {
        $this->content->implementedMethod();
    }
};