Skip to content

Commit 8cf8fa0

Browse files
authored
Merge pull request #2108 from alcaeus/gh-2106
Fix merging of documents when not cascading references
2 parents 182a04b + 03eadf7 commit 8cf8fa0

2 files changed

Lines changed: 30 additions & 0 deletions

File tree

lib/Doctrine/ODM/MongoDB/UnitOfWork.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1938,6 +1938,11 @@ private function doMerge($document, array &$visited, $prevManagedCopy = null, $a
19381938
$targetClass = $this->dm->getClassMetadata($targetDocument);
19391939
$relatedId = $targetClass->getIdentifierObject($other);
19401940

1941+
$current = $prop->getValue($managedCopy);
1942+
if ($current !== null) {
1943+
$this->removeFromIdentityMap($current);
1944+
}
1945+
19411946
if ($targetClass->subClasses) {
19421947
$other = $this->dm->find($targetClass->name, $relatedId);
19431948
} else {

tests/Doctrine/ODM/MongoDB/Tests/Functional/DetachedDocumentTest.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Doctrine\Tests\ORM\Functional;
44

5+
use Documents\CmsArticle;
56
use Documents\CmsUser;
67
use Documents\CmsPhonenumber;
78
use Documents\CmsAddress;
@@ -132,4 +133,28 @@ public function testUninitializedLazyAssociationsAreIgnoredOnMerge()
132133
$this->assertNotSame($managedAddress2->user, $detachedAddress2->user);
133134
$this->assertFalse($managedAddress2->user->__isInitialized());
134135
}
136+
137+
public function testMergeWithReference()
138+
{
139+
$cmsUser = new CmsUser();
140+
$cmsUser->username = 'alcaeus';
141+
142+
$cmsArticle = new CmsArticle();
143+
$cmsArticle->setAuthor($cmsUser);
144+
145+
$this->dm->persist($cmsUser);
146+
$this->dm->persist($cmsArticle);
147+
$this->dm->flush();
148+
$this->dm->clear();
149+
150+
/** @var CmsArticle $cmsArticle */
151+
$cmsArticle = $this->dm->find(CmsArticle::class, $cmsArticle->id);
152+
$this->assertInstanceOf(CmsArticle::class, $cmsArticle);
153+
$this->assertSame('alcaeus', $cmsArticle->user->getUsername());
154+
$this->dm->clear();
155+
156+
$cmsArticle = $this->dm->merge($cmsArticle);
157+
158+
$this->assertSame('alcaeus', $cmsArticle->user->getUsername());
159+
}
135160
}

0 commit comments

Comments
 (0)