Подтвердить что ты не робот

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

Вы могли бы подумать, что после того, как я перейду в classname для очистки, вы больше не должны видеть эти объекты в единице работы, но, посмотрев на источник, я заметил, что когда вы передаете аргумент функции clear(), это выделяет только объекты этого типа. С другой стороны, если я не передаю какие-либо аргументы в clear(), он отделяется и на самом деле становится ясным, поэтому приведенный выше код не попадает в строку 138, exit. Таким образом, это означает, что он не только отделяет все объекты, но и очищает единицу работы.

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

4b9b3361

Ответ 1

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

Метод 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. Затем в следующем примере мы видим, что единица работы имеет как минимум 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).