web-dev-qa-db-fra.com

Doctrine entitymanager clear ne s'efface pas complètement

J'ai ce morceau de code:

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

Vous penseriez qu'après avoir passé le nom de classe pour effacer, vous ne devriez plus voir ces objets dans l'unité de travail, mais en regardant la source, j'ai remarqué que lorsque vous passez un argument à la fonction clear() il détache uniquement les entités de ce type. D'un autre côté, si je ne passe aucun argument à clear() il se détache et s'efface en fait, donc le code ci-dessus ne frappe pas la ligne 138, exit. Cela signifie donc qu'il détache non seulement toutes les entités, mais efface également l'unité de travail.

Quelqu'un a des réflexions à ce sujet? Dois-je déposer un bug avec doctrine?

16
Reza S

Je dirais que techniquement ce n'est pas un bug car clear() fonctionne comme décrit dans la documentation, voir Doctrine2 API , documentation et code source ( version actuelle ).

La méthode clear() n'est qu'un moyen de detach() toutes les entités ou entités d'un type spécifié. Il peut être considéré comme un "multi-détachement", son objectif ne s'étend pas au-delà du détachement.

Lorsque vous détachez toutes les entités à l'aide de clear() Doctrine détache les entités à l'aide de la méthode la plus efficace possible. Dans le processus, le tableau d'identités est défini sur un array() vide. Cela donnera l'apparence de ce que je pense que vous faites référence comme effacé.

$entityManager->clear();
$identity = $entityManager->getUnitOfWork()->getIdentityMap(); 
//This will return a an empty array() to $identity
//therefore $identity['Reza\MyBundle\Entity\ListItem'] would be undefined

Si nous supposons que les données ont été récupérées pour une entité de Reza\MyBundle\Entity\ListItem. Ensuite, dans l'exemple suivant, nous pouvons voir que l'unité de travail a au moins 1 objet Reza\MyBundle\Entity\ListItem.

$identity = $entityManager->getUnitOfWork()->getIdentityMap();
$count = count($identity['Reza\MyBundle\Entity\ListItem']);
// $count would be > 0;

Cependant, lorsque vous utilisez clear($entityName) et effacez par type d'entité, les entités effacées/détachées sont supprimées de l'unité d'oeuvre, seule la clé de tableau [$entityName] Reste, pas les objets .

$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.

Cette fonctionnalité est tout ce qui est spécifié par la documentation.

Je pense qu'une demande de fonctionnalité est en ordre, pour la faire fonctionner de manière plus cohérente. Lorsque vous invoquez clear($entityName) Doctrine devrait unset() la clé restante la rendant ainsi indéfinie (effacée). Cela nous permettrait d'écrire plus facilement du code qui fonctionnerait si nous utilisé clear() ou clear($entityName).

37
hcoat