Doctrine entitymanager clear не полностью очищает

У меня есть этот код:

$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, выйдите. Таким образом, это означает, что он не только отделяет все сущности, но и очищает единицу работы.

У кого-нибудь есть мысли по этому поводу? Должен ли я регистрировать ошибку с помощью доктрины?

Solutions Collecting From Web of "Doctrine entitymanager clear не полностью очищает"

Я бы сказал, что технически это не ошибка, так как clear() работает так, как описано в документации, см. API Doctrine2, документацию и исходный код ( текущая версия ).

Метод clear() – это просто способ detach() все сущности или сущности указанного типа. Его можно рассматривать как «Multi-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) .