我有许多不相关的实体,我希望能够添加FileAttachment实体。我正在使用Doctrine2(在Symfony项目的上下文中)。
在我开始使用Doctrine之前,我使用了一个带有鉴别器列的联结表,如下所示:
file_id
entity_id
entity_type
据我所知,使用Doctrine我需要为每个具有FileAttachment关联的实体类型提供联结表。如果可能的话,我更愿意避免这种情况。我找到了一个NHibernate解决方案here。是否有可能与Doctrine做类似的事情,有人可以指点我的一些文档吗?我已经阅读了(现在很多次!)章节6和7的学说手册。但我找不到我想要的东西。
答案 0 :(得分:2)
尝试创建一个抽象的FileAttachment
类,并为每个entity_type
扩展它,例如EntityOneAttachment
,EntityTwoAttachment
等。
扩展类将引用相同的连接列entity_id
,但将其映射到各自的实体。
/**
* @ORM\Entity
* @ORM\Table(name="file_attachment")
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="entity_type", type="string")
* @ORM\DiscriminatorMap({"entity_one_attachment" = "EntityOneAttachment", "entity_two" = "EntityTwoAttachment"})
*/
abstract class FileAttachment
{
/**
* @ORM\ManyToOne(targetEntity="File")
* @ORM\JoinColumn(name="file_id", referencedColumnName="id", nullable=false)
**/
protected $file;
}
/**
* @ORM\Entity
*/
class EntityOneAttachment extends FileAttachment
{
/**
* @ORM\ManyToOne(targetEntity="EntityOne", inversedBy="fileAttachments")
* @ORM\JoinColumn(name="entity_id", referencedColumnName="id", nullable=false)
**/
protected $entityOne;
}
/**
* @ORM\Entity
*/
class EntityTwoAttachment extends FileAttachment
{
/**
* @ORM\ManyToOne(targetEntity="EntityTwo", inversedBy="fileAttachments")
* @ORM\JoinColumn(name="entity_id", referencedColumnName="id", nullable=false)
**/
protected $entityTwo;
}
然后将每个实体映射到其各自的Attachment类。
class EntityOne
{
/**
* @ORM\OneToMany(targetEntity="EntityOneAttachment", mappedBy="entityOne")
**/
protected $fileAttachments;
}