18

我有这段代码:

$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()它就会分离并且实际上已经清除,所以上面的代码不会到达第 138 行,退出。这意味着它不仅分离了所有实体,而且还清除了工作单元。

有人对此有任何想法吗?我应该向教义提交错误吗?

4

1 回答 1

45

我想说从技术上讲,它不是clear()文档中描述的错误,请参阅 Doctrine2 API文档源代码当前版本)。

clear()方法只是对detach()指定类型的所有实体或实体的一种方式。它可以被认为是“Multi-Detach”,它的目的并没有超越分离。

当使用clear()Doctrine 分离所有实体时,使用最有效的方法分离实体。在此过程中,身份映射数组设置为空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。然后在下面的例子中我们可以看到工作单元至少有 1 个Reza\MyBundle\Entity\ListItem对象。

$identity = $entityManager->getUnitOfWork()->getIdentityMap();
$count = count($identity['Reza\MyBundle\Entity\ListItem']);
// $count would be > 0;

但是,当您clear($entityName)按实体类型使用和清除时,已清除/分离的实体将从工作单元中删除,仅[$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).

于 2013-10-06T05:20:37.223 回答