Symfony学说OneToAll关系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Symfony学说OneToAll关系相关的知识,希望对你有一定的参考价值。

我想创建一种与教义相关的“OneToAll”关联

我有2个不相关的不同实体。我不希望它们与ManyToMany关联映射。实体包含大量条目,在这种情况下,我需要在连接表中为所有数据创建条目

我可以创建一个自定义学说关系,将一个实体连接到另一个实体的所有条目吗?它将是这样的:

/**
 * One entityA has All entityB.
 * @ORMOneToAll(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执行操作,例如更改数据然后将其保留。

请注意,这仍然存在一些最初的缺点,例如可能的性能问题,例如:与内存使用有关。不知道你试图用这种关系完成什么,这是我能想到的最好的。

以上是关于Symfony学说OneToAll关系的主要内容,如果未能解决你的问题,请参考以下文章

推进学说代码片段

与复合唯一约束的关系(symfony + 学说)

与学说 Symfony 的条件关系

Symfony 固定装置和多对多关系(学说)

Symfony学说中的许多关系

symfony 3 学说不接受主键