与Doctrine的联结表中的鉴别器

时间:2014-06-02 14:57:35

标签: doctrine junction-table discriminator

我有许多不相关的实体,我希望能够添加FileAttachment实体。我正在使用Doctrine2(在Symfony项目的上下文中)。

在我开始使用Doctrine之前,我使用了一个带有鉴别器列的联结表,如下所示:

file_id
entity_id
entity_type

据我所知,使用Doctrine我需要为每个具有FileAttachment关联的实体类型提供联结表。如果可能的话,我更愿意避免这种情况。我找到了一个N​​Hibernate解决方案here。是否有可能与Doctrine做类似的事情,有人可以指点我的一些文档吗?我已经阅读了(现在很多次!)章节67的学说手册。但我找不到我想要的东西。

1 个答案:

答案 0 :(得分:2)

尝试创建一个抽象的FileAttachment类,并为每个entity_type扩展它,例如EntityOneAttachmentEntityTwoAttachment等。

扩展类将引用相同的连接列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;
}