У меня есть этот код:
$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, выйдите. Таким образом, это означает, что он не только отделяет все сущности, но и очищает единицу работы.
У кого-нибудь есть мысли по этому поводу? Должен ли я регистрировать ошибку с помощью доктрины?
Я бы сказал, что технически это не ошибка, так как 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)
.