处理具有多个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()
来加载文件。
我不喜欢的是每次我想添加另一个具有OneToMany
和File
的实体时,它都会在数据库中创建一个新列,因此我可能会有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
的基类来引用Entity1
和Entity2
。当调用getEntities
时,Doctrine根据每个实体的鉴别器值"自动"创建适当类的实例。
File
/**
* @ORMManyToMany(targetEntity="Entity", inversedBy="images")
* @ORMJoinColumn(name="entity_id", referencedColumnName="id", nullable=true, onDelete="CASCADE")
*/
protected $entities;
OneToMany
, ManyToOne
变为ManyToMany
,因为现在文件中可能有多个实体