Doctrine2:一组实体的依赖关系图

时间:2015-11-03 14:14:51

标签: php symfony sorting doctrine-orm

使用Symfony和Doctrine,我正在编写一个组件,在部署应用程序期间使用任意实体的条目填充数据库。

我想让这个组件变得通用,所以我试图自动解析实体之间的依赖关系并以正确的顺序插入它们。

我目前通过实体元数据递归地获取每个单个实体的依赖关系:

public function getEntityDeps($eName)
{
    $deps = [];

    foreach ($this->entityManager->getClassMetadata($eName)->getAssociationMappings() as $mapping)
    {
        $deps[] = $mapping['targetEntity'];
        $deps = array_merge($deps, $this->getEntityDeps($mapping['targetEntity']));
    }

    return $deps;
}

结果显然是以下类型的列表:

// NOTE: The real list of course contains class names instead of entity aliases.
[
    "FooBundle:EntityA" => [],
    "FooBundle:EntityB" => ["FooBundle:EntityA", "FooBundle:EntityC"],
    "FooBundle:EntityC" => ["FooBundle:EntityA"],
    "BarBundle:EntityA" => ["BarBundle:EntityB"],
    "BarBundle:EntityB" => []
]

我想下一步是将某种拓扑排序应用到列表中。

但是,我不确定我是否可以在这里使用通用算法,或者我忘记了什么。特别是因为实体不一定是相关的(事实上,我们可能有多个依赖图)。

另外,我希望有一些内部的Doctrine功能可以为我做排序。

那么对任意一组Doctrine实体进行排序的最可靠方法是什么?是否有一些可重用的Doctrine功能?

1 个答案:

答案 0 :(得分:0)

因此,在深入了解Doctrine源代码一段时间之后,我发现它们确实实现了拓扑排序(DFS)。它已在Doctrine\ORM\Internal\CommitOrderCalculator中实施。

这个CommitOrderCalculator在哪里使用?当然是UnitOfWork

因此,我不需要手动计算正确的提交顺序,而是需要......将调用移到$em->flush()循环之外的foreach,然后让UOW自己完成工作。< / p>

咄。