我想说,从技术上讲,这不是一个错误,因为 clear() 的工作原理与文档中所述相同,请参阅 Doctrine2 API、documentation 和 source code (current version)。
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) 都可以工作的代码。