diff --git a/lib/Doctrine/ORM/Persisters/ManyToManyPersister.php b/lib/Doctrine/ORM/Persisters/ManyToManyPersister.php index 33dab21d1..4286264f0 100644 --- a/lib/Doctrine/ORM/Persisters/ManyToManyPersister.php +++ b/lib/Doctrine/ORM/Persisters/ManyToManyPersister.php @@ -254,7 +254,9 @@ class ManyToManyPersister extends AbstractCollectionPersister $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 000000000..bbb26fcea --- /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