3

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

/**
 * @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"),因为我希望以后能够在不触及基类的情况下创建任意数量的子类。我还需要将基类放在一个单独的数据库表中,这样这种关系才有意义。

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

4

1 回答 1

0

我最终没有使用实体继承,而是使用了委托设计模式。两者都Content实现BaseContent了一个公共接口,并将BaseContent功能委托给一个加入的内容实体。

现在,这个 BaseContent 的每个子类都将有一个连接的 Content 实体,并且可以在需要 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();
    }
};
于 2013-10-28T19:54:17.623 回答