From 9bdde11d0d956850cf4a817ef008772b13ade767 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20=C3=81ngel=20Parada?= Date: Tue, 4 Feb 2025 14:19:09 +0100 Subject: [PATCH 1/2] Fix root document entityMap --- .../ODM/MongoDB/Mapping/ClassMetadata.php | 2 +- lib/Doctrine/ODM/MongoDB/UnitOfWork.php | 24 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/Doctrine/ODM/MongoDB/Mapping/ClassMetadata.php b/lib/Doctrine/ODM/MongoDB/Mapping/ClassMetadata.php index 85dddf148..9bbdd89eb 100644 --- a/lib/Doctrine/ODM/MongoDB/Mapping/ClassMetadata.php +++ b/lib/Doctrine/ODM/MongoDB/Mapping/ClassMetadata.php @@ -2044,7 +2044,7 @@ public function setParentClasses(array $classNames): void { $this->parentClasses = $classNames; - if (count($classNames) <= 0) { + if ($this->isEmbeddedDocument || count($classNames) <= 0) { return; } diff --git a/lib/Doctrine/ODM/MongoDB/UnitOfWork.php b/lib/Doctrine/ODM/MongoDB/UnitOfWork.php index f7a728693..aae208295 100644 --- a/lib/Doctrine/ODM/MongoDB/UnitOfWork.php +++ b/lib/Doctrine/ODM/MongoDB/UnitOfWork.php @@ -1505,11 +1505,11 @@ public function addToIdentityMap(object $document): bool $class = $this->dm->getClassMetadata($document::class); $id = $this->getIdForIdentityMap($document); - if (isset($this->identityMap[$class->name][$id])) { + if (isset($this->identityMap[$class->rootDocumentName][$id])) { return false; } - $this->identityMap[$class->name][$id] = $document; + $this->identityMap[$class->rootDocumentName][$id] = $document; if ($document instanceof NotifyPropertyChanged && ! $this->isUninitializedObject($document)) { $document->addPropertyChangedListener($this); @@ -1597,8 +1597,8 @@ public function removeFromIdentityMap(object $document): bool $class = $this->dm->getClassMetadata($document::class); $id = $this->getIdForIdentityMap($document); - if (isset($this->identityMap[$class->name][$id])) { - unset($this->identityMap[$class->name][$id]); + if (isset($this->identityMap[$class->rootDocumentName][$id])) { + unset($this->identityMap[$class->rootDocumentName][$id]); $this->documentStates[$oid] = self::STATE_DETACHED; return true; @@ -1629,7 +1629,7 @@ public function getById($id, ClassMetadata $class): object $serializedId = serialize($class->getDatabaseIdentifierValue($id)); - return $this->identityMap[$class->name][$serializedId]; + return $this->identityMap[$class->rootDocumentName][$serializedId]; } /** @@ -1658,7 +1658,7 @@ public function tryGetById($id, ClassMetadata $class) $serializedId = serialize($class->getDatabaseIdentifierValue($id)); - return $this->identityMap[$class->name][$serializedId] ?? false; + return $this->identityMap[$class->rootDocumentName][$serializedId] ?? false; } /** @@ -1688,7 +1688,7 @@ public function isInIdentityMap(object $document): bool $class = $this->dm->getClassMetadata($document::class); $id = $this->getIdForIdentityMap($document); - return isset($this->identityMap[$class->name][$id]); + return isset($this->identityMap[$class->rootDocumentName][$id]); } private function getIdForIdentityMap(object $document): string @@ -2768,13 +2768,13 @@ public function getOrCreateDocument(string $className, array $data, array &$hint if (! $class->isQueryResultDocument) { $id = $class->getDatabaseIdentifierValue($data['_id']); $serializedId = serialize($id); - $isManagedObject = isset($this->identityMap[$class->name][$serializedId]); + $isManagedObject = isset($this->identityMap[$class->rootDocumentName][$serializedId]); } $oid = null; if ($isManagedObject) { /** @phpstan-var T $document */ - $document = $this->identityMap[$class->name][$serializedId]; + $document = $this->identityMap[$class->rootDocumentName][$serializedId]; $oid = spl_object_hash($document); if ($this->isUninitializedObject($document)) { $document->setProxyInitializer(null); @@ -2798,9 +2798,9 @@ public function getOrCreateDocument(string $className, array $data, array &$hint if (! $class->isQueryResultDocument) { $this->registerManaged($document, $id, $data); - $oid = spl_object_hash($document); - $this->documentStates[$oid] = self::STATE_MANAGED; - $this->identityMap[$class->name][$serializedId] = $document; + $oid = spl_object_hash($document); + $this->documentStates[$oid] = self::STATE_MANAGED; + $this->identityMap[$class->rootDocumentName][$serializedId] = $document; } $data = $this->hydratorFactory->hydrate($document, $data, $hints); From f373ffadd6b40b5fc25ef6d17760350ada9cc347 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20=C3=81ngel=20Parada?= Date: Tue, 4 Feb 2025 19:00:45 +0100 Subject: [PATCH 2/2] Fix root document entityMap --- lib/Doctrine/ODM/MongoDB/Mapping/ClassMetadata.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Doctrine/ODM/MongoDB/Mapping/ClassMetadata.php b/lib/Doctrine/ODM/MongoDB/Mapping/ClassMetadata.php index 9bbdd89eb..e92e71d80 100644 --- a/lib/Doctrine/ODM/MongoDB/Mapping/ClassMetadata.php +++ b/lib/Doctrine/ODM/MongoDB/Mapping/ClassMetadata.php @@ -2035,7 +2035,7 @@ public function setSubclasses(array $subclasses): void /** * Sets the parent class names. - * Assumes that the class names in the passed array are in the order: + * Assumes that the class names passed array are in the order: * directParent -> directParentParent -> directParentParentParent ... -> root. * * @param list $classNames