Symfony原则OneToAll关系

时间:2018-09-03 08:38:35

标签: symfony doctrine

我要创建一种与学说的“ 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

这对我有帮助吗?

1 个答案:

答案 0 :(得分:0)

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存储库:

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执行操作的服务,例如更改数据然后将其保留。

请注意,这仍然具有一些最初提到的缺点,例如可能的性能问题,例如与内存使用情况有关。在不知道您要如何完成这种关系的情况下,这是我能想到的最好的方法。