From be6890e5aa7a463980ac15511e4521cd4eb47db9 Mon Sep 17 00:00:00 2001 From: Daniel Holmes Date: Sun, 15 Jan 2012 23:25:57 +1100 Subject: [PATCH] Added fix for collection->contains when many-to-many extra lazy fetchMode --- .../ORM/Persisters/ManyToManyPersister.php | 4 +- .../ManyToManyExtraLazyContainsTest.php | 55 +++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 tests/Doctrine/Tests/ORM/Functional/ManyToManyExtraLazyContainsTest.php diff --git a/lib/Doctrine/ORM/Persisters/ManyToManyPersister.php b/lib/Doctrine/ORM/Persisters/ManyToManyPersister.php index 33dab21d1b5..4286264f0d0 100644 --- a/lib/Doctrine/ORM/Persisters/ManyToManyPersister.php +++ b/lib/Doctrine/ORM/Persisters/ManyToManyPersister.php @@ -254,7 +254,9 @@ public function contains(PersistentCollection $coll, $element) $uow = $this->_em->getUnitOfWork(); // shortcut for new entities - if ($uow->getEntityState($element, UnitOfWork::STATE_NEW) == UnitOfWork::STATE_NEW) { + $entityState = $uow->getEntityState($element, UnitOfWork::STATE_NEW); + if ($entityState == UnitOfWork::STATE_NEW || + ($entityState == UnitOfWork::STATE_MANAGED && $uow->isScheduledForInsert($element))) { return false; } diff --git a/tests/Doctrine/Tests/ORM/Functional/ManyToManyExtraLazyContainsTest.php b/tests/Doctrine/Tests/ORM/Functional/ManyToManyExtraLazyContainsTest.php new file mode 100644 index 00000000000..bbb26fceadd --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/ManyToManyExtraLazyContainsTest.php @@ -0,0 +1,55 @@ +useModelSet('company'); + parent::setUp(); + } + + public function testManyToManyExtraLazyContainsAddedPendingInsertEntityIsTrue() + { + $contract = new \Doctrine\Tests\Models\Company\CompanyFlexContract(); + + $this->_em->persist($contract); + $this->_em->flush(); + + $this->_em->clear(); + $contract = $this->_em->find('Doctrine\Tests\Models\Company\CompanyFlexContract', $contract->getId()); + + $pendingInsertManager = new \Doctrine\Tests\Models\Company\CompanyManager(); + $this->_em->persist($pendingInsertManager); + $contract->getManagers()->add($pendingInsertManager); + + $result = $contract->getManagers()->contains($pendingInsertManager); + + $this->assertTrue($result); + } + + public function testManyToManyExtraLazyContainsNonAddedPendingInsertEntityIsFalse() + { + $contract = new \Doctrine\Tests\Models\Company\CompanyFlexContract(); + + $this->_em->persist($contract); + $this->_em->flush(); + + $this->_em->clear(); + $contract = $this->_em->find('Doctrine\Tests\Models\Company\CompanyFlexContract', $contract->getId()); + + $pendingInsertManager = new \Doctrine\Tests\Models\Company\CompanyManager(); + $this->_em->persist($pendingInsertManager); + + $result = $contract->getManagers()->contains($pendingInsertManager); + + $this->assertFalse($result); + } +} \ No newline at end of file