diff --git a/lib/Doctrine/ORM/PersistentCollection.php b/lib/Doctrine/ORM/PersistentCollection.php index 25ccddd1a..834f2282b 100644 --- a/lib/Doctrine/ORM/PersistentCollection.php +++ b/lib/Doctrine/ORM/PersistentCollection.php @@ -389,6 +389,7 @@ final class PersistentCollection implements Collection if ($this->association !== null && $this->association['type'] & ClassMetadata::TO_MANY && + $this->owner && $this->association['orphanRemoval']) { $this->em->getUnitOfWork()->scheduleOrphanRemoval($removed); } @@ -427,6 +428,7 @@ final class PersistentCollection implements Collection if ($this->association !== null && $this->association['type'] & ClassMetadata::TO_MANY && + $this->owner && $this->association['orphanRemoval']) { $this->em->getUnitOfWork()->scheduleOrphanRemoval($element); } @@ -631,7 +633,9 @@ final class PersistentCollection implements Collection $uow = $this->em->getUnitOfWork(); - if ($this->association['type'] & ClassMetadata::TO_MANY && $this->association['orphanRemoval']) { + if ($this->association['type'] & ClassMetadata::TO_MANY && + $this->association['orphanRemoval'] && + $this->owner) { // we need to initialize here, as orphan removal acts like implicit cascadeRemove, // hence for event listeners we need the objects in memory. $this->initialize(); @@ -783,7 +787,7 @@ final class PersistentCollection implements Collection } $this->snapshot = array(); - + $this->changed(); } } diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1778Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1778Test.php new file mode 100644 index 000000000..aebc6422c --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1778Test.php @@ -0,0 +1,74 @@ +useModelSet('cms'); + parent::setUp(); + + $this->user = new CmsUser(); + $this->user->username = "beberlei"; + $this->user->name = "Benjamin"; + $this->user->status = "active"; + + $this->phone = new CmsPhoneNumber(); + $this->phone->phonenumber = '0123456789'; + $this->user->addPhoneNumber($this->phone); + + $this->_em->persist($this->user); + $this->_em->persist($this->phone); + $this->_em->flush(); + $this->_em->clear(); + + $this->user = $this->_em->find('Doctrine\\Tests\\Models\\CMS\\CmsUser', $this->user->getId()); + $this->phone = $this->_em->find('Doctrine\\Tests\\Models\\CMS\\CmsPhonenumber', $this->phone->phonenumber); + } + + public function testClear() + { + $clonedNumbers = clone $this->user->getPhonenumbers(); + $clonedNumbers->clear(); + $this->_em->flush(); + $this->_em->clear(); + + $this->user = $this->_em->find('Doctrine\\Tests\\Models\\CMS\\CmsUser', $this->user->getId()); + + $this->assertCount(1, $this->user->getPhonenumbers()); + } + + public function testRemove() + { + $clonedNumbers = clone $this->user->getPhonenumbers(); + $clonedNumbers->remove(0); + $this->_em->flush(); + $this->_em->clear(); + + $this->user = $this->_em->find('Doctrine\\Tests\\Models\\CMS\\CmsUser', $this->user->getId()); + + $this->assertCount(1, $this->user->getPhonenumbers()); + } + + public function testRemoveElement() + { + $clonedNumbers = clone $this->user->getPhonenumbers(); + $clonedNumbers->removeElement($this->phone); + $this->_em->flush(); + $this->_em->clear(); + + $this->user = $this->_em->find('Doctrine\\Tests\\Models\\CMS\\CmsUser', $this->user->getId()); + + $this->assertCount(1, $this->user->getPhonenumbers()); + } +}