原则实体管理器清除不完全清除

2022-08-30 20:43:23

我有这段代码:

$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;
    }
}

你可能会认为,在我传入类名进行清除后,你不应该再在工作单元中看到这些对象了,但是通过查看源代码,我注意到当你将参数传递给函数时,它只会分离该类型的实体。另一方面,如果我没有向它传递任何参数,则会分离并且实际上很清楚,因此上面的代码不会命中第138行,请退出。因此,这意味着它不仅可以分离所有实体,还可以清除工作单元。clear()clear()

有人对此有什么想法吗?我应该用教义提交一个错误吗?


答案 1

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

该方法只是指向指定类型的所有实体或实体的一种方式。它可以被认为是一个“多分离”,它的目的不会延伸到分离之外。clear()detach()

当使用 Doctrine 分离所有实体时,将使用最有效的方法分离实体。在此过程中,标识映射数组设置为空 。这将给人一种我认为你所指的已清除的外观。clear()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

如果我们假设检索了 的实体的数据。然后在下面的示例中,我们可以看到工作单元至少有1个对象。Reza\MyBundle\Entity\ListItemReza\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)unset()clear()clear($entityName)


答案 2

推荐