Symfony:处理文件实体



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

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

File.php

/**
 * @ORMManyToOne(targetEntity="Entity1", inversedBy="files")
 * @ORMJoinColumn(name="entity1_id", referencedColumnName="id", nullable=true, onDelete="CASCADE")
 */
private $entity1;
 /**
 * @ORMManyToOne(targetEntity="Entity2", inversedBy="files")
 * @ORMJoinColumn(name="entity2_id", referencedColumnName="id", nullable=true, onDelete="CASCADE")
 */
private $entity2;
and so one.... 

Entity1.php

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

上面的伟大之处在于getter和setter都设置好了,我可以自动保存并保存到数据库。关系设置好了,我可以通过调用$entity1->getFiles()来加载文件。

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

我想要实现的是将实体的类保存在class字段中,并将记录的id保存在id字段中,但仍以某种方式允许持久化和收集保存工作。

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

根本不需要class字段。

通过为你想从File引用的所有实体创建一个基类来使用Doctrine的继承映射:

/**
 * @ORMEntity()
 * @ORMInheritanceType("SINGLE_TABLE")
 * @ORMDiscriminatorColumn(name="entityType", type="string")
 * @ORMDiscriminatorMap({
 *      "entity1" = "Entity1",
 *      "entity2" = "Entity2"
 * })
 */
abstract class BaseEntity
{
    /**
     * @ORMManyToMany(targetEntity="File", mappedBy="entities" , cascade={"persist", "remove"}, orphanRemoval=true)
     */
    protected $images;
}
/**
 * @ORMEntity
 */
class Entity1 extends BaseEntity
{
    ...
}
/**
 * @ORMEntity
 */
class Entity2 extends BaseEntity
{
    ...
}

这样,您可以通过File的基类来引用Entity1Entity2。当调用getEntities时,Doctrine根据每个实体的鉴别器值"自动"创建适当类的实例。

File

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

OneToMany, ManyToOne变为ManyToMany,因为现在文件中可能有多个实体

最新更新