学说2 - 从抽象类到抽象类

时间:2015-10-08 15:29:53

标签: php doctrine-orm

好的。这个问题很难描述。但是这里。我会首先发布一些图片,只是让某人得到我从这张图片中做的事情;

enter image description here

块是可用于填充网页或博客帖子的元素。这可以是图像,文本或表格。这些块是ContentBlocks。 Block具有DiscriminatorColumn和DiscriminatorMap属性,用于连接正确的Block表并创建基础Block元素。 (即一个ImageContentBlock)

另一方面,我们有表格。表单由FormBlocks组成。这些是某些常见的Form元素。 (TextField,PhoneField等)。

我希望能够与Page,Post或Form中的Content-或FormBlocks相关联。

我如何在Doctrine中实现这一目标?

我可以在Block类中添加entityType和entityId字段。但这会消除面向对象的编程风格。我宁愿引用拥有的ContentEntity。但话又说回来。我需要加入或关联块。

并非每个ContentEntity都有Blocks。所以我不能将它添加为ContentEntity的属性。

现在。我当然可以使用ManyToMany关系并使用JoinTable。我想这总是有效的。但我必须加入两次。

1 个答案:

答案 0 :(得分:2)

我认为您的问题主要不是关于数据关系,而是关于您希望避免重复代码的事实。这导致您的“实体”位于层次结构的顶部,只是因为它具有每个实体应具有的一些共同属性。 (顺便说一句,命名实体“实体”有点令人困惑。)

也许您正在寻找的是Traits。因此,不是通过实体提供idactive,它也可以是一个特征:

trait CmsEntity
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    protected $id;

    /**
     * @ORM\Column(type="boolean")
     */
    protected $active;

    // add getters/setters and other code as you like
}

现在,您可以将此特征附加到应具有给定属性的所有实体。

/**
 * @ORM\Entity
 */
class Page
{
    use CmsEntity; // import the trait

    /**
     * @ORM\Column(type="text")
     */
    private $header;

    //  etc.
}

这将使您免于从一个主要“实体”派生所有实体的要求,该实体只包含一些共同的属性。

现在你可以在“ContentEntity”和“Block”之间创建一个直接关系(1:n我猜),这更合乎逻辑。

还有nice article详细阐述了使用Doctrine进行进一步阅读的特征。