diff --git a/lib/Doctrine/ORM/PersistentCollection.php b/lib/Doctrine/ORM/PersistentCollection.php index 30b0e01e7..ec973408d 100644 --- a/lib/Doctrine/ORM/PersistentCollection.php +++ b/lib/Doctrine/ORM/PersistentCollection.php @@ -42,6 +42,7 @@ use Closure; * @author Konsta Vesterinen * @author Roman Borschel * @author Giorgio Sironi + * @author Stefano Rodriguez * @todo Design for inheritance to allow custom implementations? */ final class PersistentCollection implements Collection, Selectable @@ -812,6 +813,13 @@ final class PersistentCollection implements Collection, Selectable throw new \RuntimeException("Matching Criteria on PersistentCollection only works on OneToMany assocations at the moment."); } + // If there are NEW objects we have to check if any of them matches the criteria + $newObjects = array(); + + if ($this->isDirty) { + $newObjects = $this->coll->matching($criteria)->toArray(); + } + $targetClass = $this->em->getClassMetadata(get_class($this->owner)); $id = $targetClass->getSingleIdReflectionProperty()->getValue($this->owner); @@ -824,7 +832,7 @@ final class PersistentCollection implements Collection, Selectable $persister = $this->em->getUnitOfWork()->getEntityPersister($this->association['targetEntity']); - return new ArrayCollection($persister->loadCriteria($criteria)); + return new ArrayCollection(array_merge($persister->loadCriteria($criteria), $newObjects)); } } diff --git a/tests/Doctrine/Tests/ORM/Functional/OneToManyBidirectionalAssociationTest.php b/tests/Doctrine/Tests/ORM/Functional/OneToManyBidirectionalAssociationTest.php index cea80fd6b..75d9d2abe 100644 --- a/tests/Doctrine/Tests/ORM/Functional/OneToManyBidirectionalAssociationTest.php +++ b/tests/Doctrine/Tests/ORM/Functional/OneToManyBidirectionalAssociationTest.php @@ -173,6 +173,30 @@ class OneToManyBidirectionalAssociationTest extends \Doctrine\Tests\OrmFunctiona $this->assertInstanceOf('Doctrine\Common\Collections\Collection', $results); $this->assertEquals(2, count($results)); } + + public function testMatchingBis() + { + $this->_createFixture(); + + $product = $this->_em->find('Doctrine\Tests\Models\ECommerce\ECommerceProduct', $this->product->getId()); + $features = $product->getFeatures(); + + $thirdFeature = new ECommerceFeature(); + $thirdFeature->setDescription('Third feature'); + $product->addFeature($thirdFeature); + + $results = $features->matching(new Criteria( + Criteria::expr()->eq('description', 'Third feature') + )); + + $this->assertInstanceOf('Doctrine\Common\Collections\Collection', $results); + $this->assertCount(1, $results); + + $results = $features->matching(new Criteria()); + + $this->assertInstanceOf('Doctrine\Common\Collections\Collection', $results); + $this->assertCount(3, $results); + } private function _createFixture() {