使用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功能?
答案 0 :(得分:0)
因此,在深入了解Doctrine源代码一段时间之后,我发现它们确实实现了拓扑排序(DFS)。它已在Doctrine\ORM\Internal\CommitOrderCalculator
中实施。
这个CommitOrderCalculator
在哪里使用?当然是UnitOfWork
。
因此,我不需要手动计算正确的提交顺序,而是需要......将调用移到$em->flush()
循环之外的foreach
,然后让UOW自己完成工作。< / p>
咄。