好的。这个问题很难描述。但是这里。我会首先发布一些图片,只是让某人得到我从这张图片中做的事情;
块是可用于填充网页或博客帖子的元素。这可以是图像,文本或表格。这些块是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。我想这总是有效的。但我必须加入两次。
答案 0 :(得分:2)
我认为您的问题主要不是关于数据关系,而是关于您希望避免重复代码的事实。这导致您的“实体”位于层次结构的顶部,只是因为它具有每个实体应具有的一些共同属性。 (顺便说一句,命名实体“实体”有点令人困惑。)
也许您正在寻找的是Traits。因此,不是通过实体提供id
和active
,它也可以是一个特征:
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进行进一步阅读的特征。