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功能?
因此,在深入研究 Doctrine 源代码一段时间后,我发现他们确实有一个拓扑排序的实现(就此而言,DFS)。它是在 中实现的Doctrine\\ORM\\Internal\\CommitOrderCalculator。
而这个CommitOrderCalculator用在什么地方呢?UnitOfWork当然,在。
因此,我不需要手动计算正确的提交顺序,只需 \xe2\x80\xa6 将调用移至遍历实体的循环$em->flush()外部,并让 UOW 自行完成工作。foreach
呃。
\n