我想创建一种与教义相关的“OneToAll”关联
我有2个不相关的不同实体。我不希望它们与ManyToMany关联映射。实体包含大量条目,在这种情况下,我需要在连接表中为所有数据创建条目
我可以创建一个自定义学说关系,将一个实体连接到另一个实体的所有条目吗?它将是这样的:
/**
* One entityA has All entityB.
* @ORM\OneToAll(targetEntity="EntityB")
*/
private $entitiesB;
我在学说文档中找到了这个:https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/inheritance-mapping.html
这可以帮助我实现目的吗?
Doctrine自然不支持这一点 - 从数据库映射的角度来看 - 每当提取表a中的一列时,加载不关联的对象是没有意义的。这也可能产生严重的性能影响。
听起来你应该单独处理A和B,或者找到一个不同的解决方案,同时对A和B进行更改,例如:通过提供某种Facade或管理两个实体的存储库的服务。如果你绝对需要这个,一个可能的选择是:通过提供一个包含单个EntityA和所有EntityB对象的类来添加另一个抽象层
class EntityAWithBs
{
private $a;
private $bs;
public function __construct(EntityA $a, array $allBs)
{
$this->a = $a;
$this->bs = $allBs;
}
public function getEntityA(): EntityA
{
return $this->a;
}
public function getAllBs(): array
{
return $this->bs;
}
}
然后,您可以创建类似自定义存储库的类,或者将以下方法添加到EntityA-repository:
public function getAWithAllBs($id): EntityAWithBs
{
$a = $this->entityManager->getRepository('EntityA')->find($id);
$bs = $this->entityManager->getRepository('EntityB')->findAll();
return new EntityAWithBs($a, $bs);
}
每当您需要同时具有所有实体B的实体A时,您只需调用存储库方法即可。您还可以展开此示例以使服务对新创建的EntityAWithBs
执行操作,例如更改数据然后将其保留。
请注意,这仍然存在一些最初的缺点,例如可能的性能问题,例如:与内存使用有关。不知道你试图用这种关系完成什么,这是我能想到的最好的。