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

lxg*_*lxg 5 php sorting symfony 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;
}
Run Code Online (Sandbox Code Playgroud)

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

// 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" => []
]
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

lxg*_*lxg 0

因此,在深入研究 Doctrine 源代码一段时间后,我发现他们确实有一个拓扑排序的实现(就此而言,DFS)。它是在 中实现的Doctrine\\ORM\\Internal\\CommitOrderCalculator

\n\n

而这个CommitOrderCalculator用在什么地方呢?UnitOfWork当然,在。

\n\n

因此,我不需要手动计算正确的提交顺序,只需 \xe2\x80\xa6 将调用移至遍历实体的循环$em->flush()外部,并让 UOW 自行完成工作。foreach

\n\n

呃。

\n