学说实体管理者明确并不完全清楚

时间:2013-09-28 00:11:37

标签: php symfony doctrine-orm doctrine

我有这段代码:

$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行,退出。这意味着它不仅可以分离所有实体,还可以清除工作单元。

有人对此有何想法?我应该提交一个带有学说的错误吗?

1 个答案:

答案 0 :(得分:34)

我会说技术上它不是一个错误,因为clear()的工作原理如文档中所述,请参阅Doctrine2 APIdocumentationsource 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),我们都可以更轻松地编写可行的代码。