DDC-1496 - Fix bug with OneToMany collections having orphanRemoval=true and Collection#clear() being called.
This commit is contained in:
parent
61e371cbdc
commit
ceadc95439
@ -567,6 +567,9 @@ final class PersistentCollection implements Collection
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ($this->association['type'] == ClassMetadata::ONE_TO_MANY && $this->association['orphanRemoval']) {
|
if ($this->association['type'] == ClassMetadata::ONE_TO_MANY && $this->association['orphanRemoval']) {
|
||||||
|
// we need to initialize here, as orphan removal acts like implicit cascadeRemove,
|
||||||
|
// hence for event listeners we need the objects in memory.
|
||||||
|
$this->initialize();
|
||||||
foreach ($this->coll as $element) {
|
foreach ($this->coll as $element) {
|
||||||
$this->em->getUnitOfWork()->scheduleOrphanRemoval($element);
|
$this->em->getUnitOfWork()->scheduleOrphanRemoval($element);
|
||||||
}
|
}
|
||||||
|
@ -13,15 +13,14 @@ require_once __DIR__ . '/../../TestInit.php';
|
|||||||
*/
|
*/
|
||||||
class OneToManyOrphanRemovalTest extends \Doctrine\Tests\OrmFunctionalTestCase
|
class OneToManyOrphanRemovalTest extends \Doctrine\Tests\OrmFunctionalTestCase
|
||||||
{
|
{
|
||||||
|
protected $userId;
|
||||||
|
|
||||||
protected function setUp()
|
protected function setUp()
|
||||||
{
|
{
|
||||||
$this->useModelSet('cms');
|
$this->useModelSet('cms');
|
||||||
|
|
||||||
parent::setUp();
|
parent::setUp();
|
||||||
}
|
|
||||||
|
|
||||||
public function testOrphanRemoval()
|
|
||||||
{
|
|
||||||
$user = new CmsUser;
|
$user = new CmsUser;
|
||||||
$user->status = 'dev';
|
$user->status = 'dev';
|
||||||
$user->username = 'romanb';
|
$user->username = 'romanb';
|
||||||
@ -35,11 +34,13 @@ class OneToManyOrphanRemovalTest extends \Doctrine\Tests\OrmFunctionalTestCase
|
|||||||
$this->_em->persist($user);
|
$this->_em->persist($user);
|
||||||
$this->_em->flush();
|
$this->_em->flush();
|
||||||
|
|
||||||
$userId = $user->getId();
|
$this->userId = $user->getId();
|
||||||
|
|
||||||
$this->_em->clear();
|
$this->_em->clear();
|
||||||
|
}
|
||||||
|
|
||||||
$userProxy = $this->_em->getReference('Doctrine\Tests\Models\CMS\CmsUser', $userId);
|
public function testOrphanRemoval()
|
||||||
|
{
|
||||||
|
$userProxy = $this->_em->getReference('Doctrine\Tests\Models\CMS\CmsUser', $this->userId);
|
||||||
|
|
||||||
$this->_em->remove($userProxy);
|
$this->_em->remove($userProxy);
|
||||||
$this->_em->flush();
|
$this->_em->flush();
|
||||||
@ -55,4 +56,20 @@ class OneToManyOrphanRemovalTest extends \Doctrine\Tests\OrmFunctionalTestCase
|
|||||||
|
|
||||||
$this->assertEquals(0, count($result), 'CmsPhonenumber should be removed by orphanRemoval');
|
$this->assertEquals(0, count($result), 'CmsPhonenumber should be removed by orphanRemoval');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group DDC-1496
|
||||||
|
*/
|
||||||
|
public function testOrphanRemovalUnitializedCollection()
|
||||||
|
{
|
||||||
|
$user = $this->_em->find('Doctrine\Tests\Models\CMS\CmsUser', $this->userId);
|
||||||
|
|
||||||
|
$user->phonenumbers->clear();
|
||||||
|
$this->_em->flush();
|
||||||
|
|
||||||
|
$query = $this->_em->createQuery('SELECT p FROM Doctrine\Tests\Models\CMS\CmsPhonenumber p');
|
||||||
|
$result = $query->getResult();
|
||||||
|
|
||||||
|
$this->assertEquals(0, count($result), 'CmsPhonenumber should be removed by orphanRemoval');
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user