Symfony:处理文件实体

时间:2015-09-15 07:08:32

标签: symfony doctrine

处理具有多个File关系的ManyToOne实体的最佳方法是什么?

假设我有5个与OneToMany实体有File关系的实体。

File.php

/**
 * @ORM\ManyToOne(targetEntity="Entity1", inversedBy="files")
 * @ORM\JoinColumn(name="entity1_id", referencedColumnName="id", nullable=true, onDelete="CASCADE")
 */
private $entity1;

 /**
 * @ORM\ManyToOne(targetEntity="Entity2", inversedBy="files")
 * @ORM\JoinColumn(name="entity2_id", referencedColumnName="id", nullable=true, onDelete="CASCADE")
 */
private $entity2;

and so one.... 

Entity1.php

  /**
 * @ORM\OneToMany(targetEntity="File", mappedBy="entity1" , cascade={"persist", "remove"}, orphanRemoval=true)
 */
protected $images;

关于以上内容的好处是设置了getter和setter,我可以自动保存并保存到数据库中。设置了关系,我只需调用$entity1->getFiles()即可加载文件。

我不喜欢的是每次我想要添加另一个OneToManyFile的实体时,它会在数据库中创建一个新列,因此我可能有10列引用来自Ids的ID其他实体。

我想要实现的是将实体的类保存在class字段中,并将记录的id保存在id字段中,但也会以某种方式保留持久性和收藏节省工作。

entity_id | class
------------------------------------------
2         | ProjectBundle/Entity/Entity1
3         | ProjectBundle/Entity/Entity2

1 个答案:

答案 0 :(得分:1)

您根本不需要class字段。

通过为File引用的所有实体创建基类来使用Doctrine's inheritance mapping

/**
 * @ORM\Entity()
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="entityType", type="string")
 * @ORM\DiscriminatorMap({
 *      "entity1" = "Entity1",
 *      "entity2" = "Entity2"
 * })
 */
abstract class BaseEntity
{
    /**
     * @ORM\ManyToMany(targetEntity="File", mappedBy="entities" , cascade={"persist", "remove"}, orphanRemoval=true)
     */
    protected $images;
}

/**
 * @ORM\Entity
 */
class Entity1 extends BaseEntity
{
    ...
}

/**
 * @ORM\Entity
 */
class Entity2 extends BaseEntity
{
    ...
}

这样,您可以通过Entity1的基类引用Entity2File。当调用getEntities时,Doctrine会根据每个实体的鉴别值自动生成#34;自动"的实例。

File

/**
 * @ORM\ManyToMany(targetEntity="Entity", inversedBy="images")
 * @ORM\JoinColumn(name="entity_id", referencedColumnName="id", nullable=true, onDelete="CASCADE")
 */
 protected $entities;

OneToManyManyToOne变为ManyToMany,因为现在该文件可能包含许多实体。