diff --git a/lib/Doctrine/ODM/MongoDB/UnitOfWork.php b/lib/Doctrine/ODM/MongoDB/UnitOfWork.php index 711f5bc22d..33ba0459cb 100644 --- a/lib/Doctrine/ODM/MongoDB/UnitOfWork.php +++ b/lib/Doctrine/ODM/MongoDB/UnitOfWork.php @@ -1357,6 +1357,10 @@ public function scheduleForDelete(object $document, bool $isView = false): void unset($this->documentUpdates[$oid]); } + if (isset($this->documentUpserts[$oid])) { + unset($this->documentUpserts[$oid]); + } + if (isset($this->documentDeletions[$oid])) { return; } diff --git a/tests/Doctrine/ODM/MongoDB/Tests/UnitOfWorkTest.php b/tests/Doctrine/ODM/MongoDB/Tests/UnitOfWorkTest.php index ae2e6080b4..9bcbfbe65f 100644 --- a/tests/Doctrine/ODM/MongoDB/Tests/UnitOfWorkTest.php +++ b/tests/Doctrine/ODM/MongoDB/Tests/UnitOfWorkTest.php @@ -116,6 +116,24 @@ public function testRegisterRemovedOnNewEntityIsIgnored() $this->assertFalse($this->uow->isScheduledForDelete($user)); } + public function testScheduleForDeleteShouldUnregisterScheduledUpserts() + { + $class = $this->dm->getClassMetadata(ForumUser::class); + $user = new ForumUser(); + $user->id = new ObjectId(); + $this->assertFalse($this->uow->isScheduledForInsert($user)); + $this->assertFalse($this->uow->isScheduledForUpsert($user)); + $this->assertFalse($this->uow->isScheduledForDelete($user)); + $this->uow->scheduleForUpsert($class, $user); + $this->assertFalse($this->uow->isScheduledForInsert($user)); + $this->assertTrue($this->uow->isScheduledForUpsert($user)); + $this->assertFalse($this->uow->isScheduledForDelete($user)); + $this->uow->scheduleForDelete($user); + $this->assertFalse($this->uow->isScheduledForInsert($user)); + $this->assertFalse($this->uow->isScheduledForUpsert($user)); + $this->assertTrue($this->uow->isScheduledForDelete($user)); + } + public function testThrowsOnPersistOfMappedSuperclass() { $this->expectException(MongoDBException::class);