处理具有多个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()
即可加载文件。
我不喜欢的是每次我想要添加另一个OneToMany
和File
的实体时,它会在数据库中创建一个新列,因此我可能有10列引用来自Ids的ID其他实体。
我想要实现的是将实体的类保存在class
字段中,并将记录的id
保存在id
字段中,但也会以某种方式保留持久性和收藏节省工作。
entity_id | class
------------------------------------------
2 | ProjectBundle/Entity/Entity1
3 | ProjectBundle/Entity/Entity2
答案 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
的基类引用Entity2
和File
。当调用getEntities
时,Doctrine会根据每个实体的鉴别值自动生成#34;自动"的实例。
File
/**
* @ORM\ManyToMany(targetEntity="Entity", inversedBy="images")
* @ORM\JoinColumn(name="entity_id", referencedColumnName="id", nullable=true, onDelete="CASCADE")
*/
protected $entities;
OneToMany
,ManyToOne
变为ManyToMany
,因为现在该文件可能包含许多实体。