1
0
mirror of synced 2025-01-18 22:41:43 +03:00

DDC-555 - Fixed toggling of collections when using Collection::clear() in a PersistentCollection context

This commit is contained in:
Benjamin Eberlei 2010-07-03 16:55:56 +02:00
parent c5656eb039
commit fbaa4e3215
3 changed files with 122 additions and 134 deletions

View File

@ -566,6 +566,7 @@ final class PersistentCollection implements Collection
if ($this->_association->isOwningSide) {
$this->_changed();
$this->_em->getUnitOfWork()->scheduleCollectionDeletion($this);
$this->takeSnapshot();
}
return $result;

View File

@ -135,71 +135,6 @@ class BasicFunctionalTest extends \Doctrine\Tests\OrmFunctionalTestCase
$this->assertTrue($user2->address instanceof CmsAddress);
$this->assertFalse($user2->address instanceof \Doctrine\ORM\Proxy\Proxy);
}
public function testBasicManyToMany()
{
$user = new CmsUser;
$user->name = 'Guilherme';
$user->username = 'gblanco';
$user->status = 'developer';
$group = new CmsGroup;
$group->name = 'Developers';
$user->groups[] = $group;
$group->users[] = $user;
$this->_em->persist($user);
$this->_em->flush();
unset($group->users[0]); // inverse side
unset($user->groups[0]); // owning side!
$this->_em->flush();
// Check that the link in the association table has been deleted
$count = $this->_em->getConnection()->executeQuery(
"SELECT COUNT(*) FROM cms_users_groups", array()
)->fetchColumn();
$this->assertEquals(0, $count);
}
public function testManyToManyCollectionClearing()
{
$user = new CmsUser;
$user->name = 'Guilherme';
$user->username = 'gblanco';
$user->status = 'developer';
for ($i=0; $i<10; ++$i) {
$group = new CmsGroup;
$group->name = 'Developers_' . $i;
$user->groups[] = $group;
$group->users[] = $user;
}
$this->_em->persist($user);
$this->_em->flush();
// Check that there are indeed 10 links in the association table
$count = $this->_em->getConnection()->executeQuery(
"SELECT COUNT(*) FROM cms_users_groups", array()
)->fetchColumn();
$this->assertEquals(10, $count);
$user->groups->clear();
//unset($user->groups);
$this->_em->flush();
// Check that the links in the association table have been deleted
$count = $this->_em->getConnection()->executeQuery(
"SELECT COUNT(*) FROM cms_users_groups", array()
)->fetchColumn();
$this->assertEquals(0, $count);
}
public function testOneToManyOrphanRemoval()
{
@ -305,52 +240,6 @@ class BasicFunctionalTest extends \Doctrine\Tests\OrmFunctionalTestCase
$this->assertEquals(0, $users[0]->phonenumbers->count());
//$this->assertNull($users[0]->articles);
}
public function testBasicManyToManyJoin()
{
$user = new CmsUser;
$user->name = 'Guilherme';
$user->username = 'gblanco';
$user->status = 'developer';
$group1 = new CmsGroup;
$group1->setName('Doctrine Developers');
$user->addGroup($group1);
$this->_em->persist($user);
$this->_em->flush();
$this->_em->clear();
$this->assertEquals(0, $this->_em->getUnitOfWork()->size());
$query = $this->_em->createQuery("select u, g from Doctrine\Tests\Models\CMS\CmsUser u join u.groups g");
$result = $query->getResult();
$this->assertEquals(2, $this->_em->getUnitOfWork()->size());
$this->assertTrue($result[0] instanceof CmsUser);
$this->assertEquals('Guilherme', $result[0]->name);
$this->assertEquals(1, $result[0]->getGroups()->count());
$groups = $result[0]->getGroups();
$this->assertEquals('Doctrine Developers', $groups[0]->getName());
$this->assertEquals(\Doctrine\ORM\UnitOfWork::STATE_MANAGED, $this->_em->getUnitOfWork()->getEntityState($result[0]));
$this->assertEquals(\Doctrine\ORM\UnitOfWork::STATE_MANAGED, $this->_em->getUnitOfWork()->getEntityState($groups[0]));
$this->assertTrue($groups instanceof \Doctrine\ORM\PersistentCollection);
$this->assertTrue($groups[0]->getUsers() instanceof \Doctrine\ORM\PersistentCollection);
$groups[0]->getUsers()->clear();
$groups->clear();
$this->_em->flush();
$this->_em->clear();
$query = $this->_em->createQuery("select u, g from Doctrine\Tests\Models\CMS\CmsUser u join u.groups g");
$this->assertEquals(0, count($query->getResult()));
}
public function testBasicRefresh()
{

View File

@ -20,27 +20,57 @@ class ManyToManyBasicAssociationTest extends \Doctrine\Tests\OrmFunctionalTestCa
$this->useModelSet('cms');
parent::setUp();
}
public function testUnsetManyToMany()
{
$user = $this->addCmsUserGblancoWithGroups(1);
unset($user->groups[0]->users[0]); // inverse side
unset($user->groups[0]); // owning side!
$this->_em->flush();
// Check that the link in the association table has been deleted
$this->assertGblancoGroupCountIs(0);
}
public function testBasicManyToManyJoin()
{
$user = $this->addCmsUserGblancoWithGroups(1);
$this->_em->clear();
$this->assertEquals(0, $this->_em->getUnitOfWork()->size());
$query = $this->_em->createQuery("select u, g from Doctrine\Tests\Models\CMS\CmsUser u join u.groups g");
$result = $query->getResult();
$this->assertEquals(2, $this->_em->getUnitOfWork()->size());
$this->assertTrue($result[0] instanceof CmsUser);
$this->assertEquals('Guilherme', $result[0]->name);
$this->assertEquals(1, $result[0]->getGroups()->count());
$groups = $result[0]->getGroups();
$this->assertEquals('Developers_0', $groups[0]->getName());
$this->assertEquals(\Doctrine\ORM\UnitOfWork::STATE_MANAGED, $this->_em->getUnitOfWork()->getEntityState($result[0]));
$this->assertEquals(\Doctrine\ORM\UnitOfWork::STATE_MANAGED, $this->_em->getUnitOfWork()->getEntityState($groups[0]));
$this->assertTrue($groups instanceof \Doctrine\ORM\PersistentCollection);
$this->assertTrue($groups[0]->getUsers() instanceof \Doctrine\ORM\PersistentCollection);
$groups[0]->getUsers()->clear();
$groups->clear();
$this->_em->flush();
$this->_em->clear();
$query = $this->_em->createQuery("select u, g from Doctrine\Tests\Models\CMS\CmsUser u join u.groups g");
$this->assertEquals(0, count($query->getResult()));
}
public function testManyToManyAddRemove()
{
// Set up user with 2 groups
$user = new CmsUser;
$user->username = 'romanb';
$user->status = 'dev';
$user->name = 'Roman B.';
$group1 = new CmsGroup;
$group1->name = 'Developers';
$group2 = new CmsGroup;
$group2->name = 'Humans';
$user->addGroup($group1);
$user->addGroup($group2);
$this->_em->persist($user); // cascades to groups
$this->_em->flush();
$user = $this->addCmsUserGblancoWithGroups(2);
$this->_em->clear();
$uRep = $this->_em->getRepository(get_class($user));
@ -73,10 +103,7 @@ class ManyToManyBasicAssociationTest extends \Doctrine\Tests\OrmFunctionalTestCa
public function testManyToManyInverseSideIgnored()
{
$user = new CmsUser;
$user->username = 'romanb';
$user->status = 'dev';
$user->name = 'Roman B.';
$user = $this->addCmsUserGblancoWithGroups(0);
$group = new CmsGroup;
$group->name = 'Humans';
@ -95,5 +122,76 @@ class ManyToManyBasicAssociationTest extends \Doctrine\Tests\OrmFunctionalTestCa
$this->assertNotNull($user2, "Has to return exactly one entry.");
$this->assertEquals(0, $user2->getGroups()->count());
}
public function testManyToManyCollectionClearing()
{
$user = $this->addCmsUserGblancoWithGroups($groupCount = 10);
// Check that there are indeed 10 links in the association table
$this->assertGblancoGroupCountIs($groupCount);
$user->groups->clear();
$this->_em->flush();
// Check that the links in the association table have been deleted
$this->assertGblancoGroupCountIs(0);
}
public function testManyToManyCollectionClearAndAdd()
{
$user = $this->addCmsUserGblancoWithGroups($groupCount = 10);
$groups = $user->groups->toArray();
$user->groups->clear();
foreach ($groups AS $group) {
$user->groups[] = $group;
}
$this->assertType('Doctrine\ORM\PersistentCollection', $user->groups);
$this->assertTrue($user->groups->isDirty());
$this->assertEquals($groupCount, count($user->groups), "There should be 10 groups in the collection.");
$this->_em->flush();
$this->assertGblancoGroupCountIs($groupCount);
}
/**
* @param int $expectedGroupCount
*/
public function assertGblancoGroupCountIs($expectedGroupCount)
{
$countDql = "SELECT count(g.id) FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN u.groups g WHERE u.username = 'gblanco'";
$this->assertEquals(
$expectedGroupCount,
$this->_em->createQuery($countDql)->getSingleScalarResult(),
"Failed to verify that CmsUser with username 'gblanco' has a group count of 10 with a DQL count query."
);
}
/**
* @param int $groupCount
* @return CmsUser
*/
public function addCmsUserGblancoWithGroups($groupCount = 1)
{
$user = new CmsUser;
$user->name = 'Guilherme';
$user->username = 'gblanco';
$user->status = 'developer';
for ($i=0; $i < $groupCount; ++$i) {
$group = new CmsGroup;
$group->name = 'Developers_' . $i;
$user->addGroup($group);
}
$this->_em->persist($user);
$this->_em->flush();
return $user;
}
}