我有这段代码:
$entityManager->clear('Reza\MyBundle\Entity\ListItem');
$identity = $entityManager->getUnitOfWork()->getIdentityMap();
foreach ($identity as $class => $objectlist) {
if ($class == 'Reza\MyBundle\Entity\ListItem') {
print "didn't fully clear, exiting..\n ";
exit;
}
}
您会认为在我将类名传递给clear之后,您不应再在工作单元中看到这些对象,但是通过查看源代码我注意到当您将参数传递给clear()
时使其仅分离该类型的实体。另一方面,如果我没有向clear()
传递任何参数,它会分离并确实清除,所以上面的代码没有命中第138行,退出。这意味着它不仅可以分离所有实体,还可以清除工作单元。
有人对此有何想法?我应该提交一个带有学说的错误吗?
答案 0 :(得分:34)
我会说技术上它不是一个错误,因为clear()
的工作原理如文档中所述,请参阅Doctrine2 API,documentation和source code({{3} })。
clear()
方法只是detach()
指定类型的所有实体或实体的一种方式。
它可以被认为是“多分离”,它的目的不是延伸过去分离。
使用clear()
分离所有实体时,Doctrine可以使用最有效的方法分离实体。在此过程中,Identity Map Array设置为空array()
。
这将使我认为你所指的是清除的外观。
$entityManager->clear();
$identity = $entityManager->getUnitOfWork()->getIdentityMap();
//This will return a an empty array() to $identity
//therefore $identity['Reza\MyBundle\Entity\ListItem'] would be undefined
如果我们假设为“Reza \ MyBundle \ Entity \ ListItem”的实体检索了数据。
然后在下面的示例中,我们可以看到unit of work
至少有1个'Reza \ MyBundle \ Entity \ ListItem'对象。
$identity = $entityManager->getUnitOfWork()->getIdentityMap();
$count = count($identity['Reza\MyBundle\Entity\ListItem']);
//$count would be > 0;
但是当您使用clear($entityName)
并按实体类型清除时,清除/分离的实体将从unit of work
中删除,只剩下数组键[$entityName]
,而不是任何对象。
$entityManager->clear('Reza\MyBundle\Entity\ListItem');
$identity = $entityManager->getUnitOfWork()->getIdentityMap();
$count = count($identity['Reza\MyBundle\Entity\ListItem']);
//$count would be == 0. All Objects cleared/detached.
此功能完全由文档指定。
我确实认为功能请求是有序的,以使其更加一致。
当调用clear($entityName)
Doctrine应该unset()
剩下的密钥从而使其未定义(清除)。这样,无论我们使用clear()
还是clear($entityName)
,我们都可以更轻松地编写可行的代码。