From fe11831bd728a281f63f84003e031bea7be74218 Mon Sep 17 00:00:00 2001 From: "Fabio B. Silva" Date: Wed, 27 Jun 2012 12:37:09 -0300 Subject: [PATCH] test remove item and clear collection --- .../ORM/Persisters/ManyToManyPersister.php | 20 +++- tests/Doctrine/Tests/Models/Quote/User.php | 19 ++++ .../ORM/Functional/Ticket/DDC1885Test.php | 92 ++++++++++++++++--- 3 files changed, 115 insertions(+), 16 deletions(-) diff --git a/lib/Doctrine/ORM/Persisters/ManyToManyPersister.php b/lib/Doctrine/ORM/Persisters/ManyToManyPersister.php index 7e017f530..db2792152 100644 --- a/lib/Doctrine/ORM/Persisters/ManyToManyPersister.php +++ b/lib/Doctrine/ORM/Persisters/ManyToManyPersister.php @@ -40,11 +40,20 @@ class ManyToManyPersister extends AbstractCollectionPersister */ protected function _getDeleteRowSQL(PersistentCollection $coll) { + $columns = array(); $mapping = $coll->getMapping(); $class = $this->_em->getClassMetadata(get_class($coll->getOwner())); + foreach ($mapping['joinTable']['joinColumns'] as $joinColumn) { + $columns[] = $this->quoteStrategy->getJoinColumnName($joinColumn, $class, $this->platform); + } + + foreach ($mapping['joinTable']['inverseJoinColumns'] as $joinColumn) { + $columns[] = $this->quoteStrategy->getJoinColumnName($joinColumn, $class, $this->platform); + } + return 'DELETE FROM ' . $this->quoteStrategy->getJoinTableName($mapping, $class, $this->platform) - . ' WHERE ' . implode(' = ? AND ', $mapping['joinTableColumns']) . ' = ?'; + . ' WHERE ' . implode(' = ? AND ', $columns) . ' = ?'; } /** @@ -155,12 +164,17 @@ class ManyToManyPersister extends AbstractCollectionPersister */ protected function _getDeleteSQL(PersistentCollection $coll) { - $class = $this->_em->getClassMetadata(get_class($coll->getOwner())); + $columns = array(); $mapping = $coll->getMapping(); + $class = $this->_em->getClassMetadata(get_class($coll->getOwner())); $joinTable = $this->quoteStrategy->getJoinTableName($mapping, $class, $this->platform); + foreach ($mapping['joinTable']['joinColumns'] as $joinColumn) { + $columns[] = $this->quoteStrategy->getJoinColumnName($joinColumn, $class, $this->platform); + } + return 'DELETE FROM ' . $joinTable - . ' WHERE ' . implode(' = ? AND ', array_keys($mapping['relationToSourceKeyColumns'])) . ' = ?'; + . ' WHERE ' . implode(' = ? AND ', $columns) . ' = ?'; } /** diff --git a/tests/Doctrine/Tests/Models/Quote/User.php b/tests/Doctrine/Tests/Models/Quote/User.php index fe700c09c..d034f598d 100644 --- a/tests/Doctrine/Tests/Models/Quote/User.php +++ b/tests/Doctrine/Tests/Models/Quote/User.php @@ -52,6 +52,25 @@ class User */ public $groups; + /** + * @ManyToMany(targetEntity="Group", inversedBy="users", cascade={"all"}, fetch="EXTRA_LAZY") + * @JoinTable(name="`quote-extra-lazy-users-groups`", + * joinColumns={ + * @JoinColumn( + * name="`user-id`", + * referencedColumnName="`user-id`" + * ) + * }, + * inverseJoinColumns={ + * @JoinColumn( + * name="`group-id`", + * referencedColumnName="`group-id`" + * ) + * } + * ) + */ + public $extraLazyGroups; + public function __construct() { $this->phones = new ArrayCollection; diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1885Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1885Test.php index 8818e2776..09b55fbc4 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1885Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1885Test.php @@ -14,6 +14,11 @@ require_once __DIR__ . '/../../../TestInit.php'; class DDC1885Test extends \Doctrine\Tests\OrmFunctionalTestCase { + /** + * @var \Doctrine\Tests\Models\Quote\User + */ + private $user; + protected function setUp() { parent::setUp(); @@ -26,28 +31,30 @@ class DDC1885Test extends \Doctrine\Tests\OrmFunctionalTestCase )); } catch(\Exception $e) { } - } - - public function testCreateRetreaveUpdateDelete() - { - - $g1 = new Group('G 1'); - $g2 = new Group('G 2'); - $user = new User(); + $user = new User(); $user->name = "FabioBatSilva"; $user->email = "fabio.bat.silva@gmail.com"; - $user->groups[] = $g1; - $user->groups[] = $g2; + $user->groups[] = new Group('G 1'); + $user->groups[] = new Group('G 2'); + $this->user = $user; // Create $this->_em->persist($user); $this->_em->flush(); $this->_em->clear(); + + } - $u1Id = $user->id; - $g1Id = $g1->id; - $g2Id = $g2->id; + public function testCreateRetreaveUpdateDelete() + { + $user = $this->user; + $g1 = $user->getGroups()->get(0); + $g2 = $user->getGroups()->get(1); + + $u1Id = $user->id; + $g1Id = $g1->id; + $g2Id = $g2->id; // Retreave $user = $this->_em->find('Doctrine\Tests\Models\Quote\User', $u1Id); @@ -89,4 +96,63 @@ class DDC1885Test extends \Doctrine\Tests\OrmFunctionalTestCase $this->assertNull($this->_em->find('Doctrine\Tests\Models\Quote\Group', $g2Id)); } + public function testRemoveItem() + { + $user = $this->user; + $u1Id = $user->id; + $user = $this->_em->find('Doctrine\Tests\Models\Quote\User', $u1Id); + + $this->assertInstanceOf('Doctrine\Tests\Models\Quote\User', $user); + $this->assertEquals('FabioBatSilva', $user->name); + $this->assertEquals($u1Id, $user->id); + + $this->assertCount(2, $user->groups); + $this->assertInstanceOf('Doctrine\Tests\Models\Quote\Group', $user->getGroups()->get(0)); + $this->assertInstanceOf('Doctrine\Tests\Models\Quote\Group', $user->getGroups()->get(1)); + + $user->getGroups()->remove(0); + + // Update + $this->_em->persist($user); + $this->_em->flush(); + $this->_em->clear(); + + $user = $this->_em->find('Doctrine\Tests\Models\Quote\User', $u1Id); + + $this->assertInstanceOf('Doctrine\Tests\Models\Quote\User', $user); + $this->assertEquals('FabioBatSilva', $user->name); + $this->assertEquals($u1Id, $user->id); + + $this->assertCount(1, $user->getGroups()); + } + + public function testClearAll() + { + $user = $this->user; + $u1Id = $user->id; + $user = $this->_em->find('Doctrine\Tests\Models\Quote\User', $u1Id); + + $this->assertInstanceOf('Doctrine\Tests\Models\Quote\User', $user); + $this->assertEquals('FabioBatSilva', $user->name); + $this->assertEquals($u1Id, $user->id); + + $this->assertCount(2, $user->groups); + $this->assertInstanceOf('Doctrine\Tests\Models\Quote\Group', $user->getGroups()->get(0)); + $this->assertInstanceOf('Doctrine\Tests\Models\Quote\Group', $user->getGroups()->get(1)); + + $user->getGroups()->clear(); + + // Update + $this->_em->persist($user); + $this->_em->flush(); + $this->_em->clear(); + + $user = $this->_em->find('Doctrine\Tests\Models\Quote\User', $u1Id); + + $this->assertInstanceOf('Doctrine\Tests\Models\Quote\User', $user); + $this->assertEquals('FabioBatSilva', $user->name); + $this->assertEquals($u1Id, $user->id); + + $this->assertCount(0, $user->getGroups()); + } } \ No newline at end of file