diff --git a/lib/Doctrine/ORM/UnitOfWork.php b/lib/Doctrine/ORM/UnitOfWork.php index fe12e55df..194e45e30 100644 --- a/lib/Doctrine/ORM/UnitOfWork.php +++ b/lib/Doctrine/ORM/UnitOfWork.php @@ -3378,7 +3378,7 @@ class UnitOfWork implements PropertyChangedListener } else { if ($other instanceof Proxy && !$other->__isInitialized()) { // do not merge fields marked lazy that have not been fetched. - return; + continue; } if ( ! $assoc2['isCascadeMerge']) { @@ -3406,7 +3406,7 @@ class UnitOfWork implements PropertyChangedListener if ($mergeCol instanceof PersistentCollection && ! $mergeCol->isInitialized()) { // do not merge fields marked lazy that have not been fetched. // keep the lazy persistent collection of the managed copy. - return; + continue; } $managedCol = $prop->getValue($managedCopy); diff --git a/tests/Doctrine/Tests/Models/DDC3699/DDC3699Child.php b/tests/Doctrine/Tests/Models/DDC3699/DDC3699Child.php new file mode 100644 index 000000000..320f73138 --- /dev/null +++ b/tests/Doctrine/Tests/Models/DDC3699/DDC3699Child.php @@ -0,0 +1,21 @@ +useModelSet('ddc3699'); + + parent::setUp(); + } + + /** + * @group DDC-3699 + */ + public function testMergingParentClassFieldsDoesNotStopMergingScalarFieldsForToOneUninitializedAssociations() + { + $id = 1; + + $child = new DDC3699Child(); + + $child->id = $id; + $child->childField = 'childValue'; + $child->parentField = 'parentValue'; + + $relation = new DDC3699RelationOne(); + + $relation->id = $id; + $relation->child = $child ; + $child->oneRelation = $relation; + + $this->_em->persist($relation); + $this->_em->persist($child); + $this->_em->flush(); + $this->_em->clear(); + + // fixtures loaded + /* @var $unManagedChild DDC3699Child */ + $unManagedChild = $this->_em->find(DDC3699Child::CLASSNAME, $id); + + $this->_em->detach($unManagedChild); + + // make it managed again + $this->_em->find(DDC3699Child::CLASSNAME, $id); + + $unManagedChild->childField = 'modifiedChildValue'; + $unManagedChild->parentField = 'modifiedParentValue'; + + /* @var $mergedChild DDC3699Child */ + $mergedChild = $this->_em->merge($unManagedChild); + + $this->assertSame($mergedChild->childField, 'modifiedChildValue'); + $this->assertSame($mergedChild->parentField, 'modifiedParentValue'); + } + + /** + * @group DDC-3699 + */ + public function testMergingParentClassFieldsDoesNotStopMergingScalarFieldsForToManyUninitializedAssociations() + { + $id = 2; + + $child = new DDC3699Child(); + + $child->id = $id; + $child->childField = 'childValue'; + $child->parentField = 'parentValue'; + + $relation = new DDC3699RelationMany(); + + $relation->id = $id; + $relation->child = $child ; + $child->relations[] = $relation; + + $this->_em->persist($relation); + $this->_em->persist($child); + $this->_em->flush(); + $this->_em->clear(); + + /* @var $unmanagedChild DDC3699Child */ + $unmanagedChild = $this->_em->find(DDC3699Child::CLASSNAME, $id); + $this->_em->detach($unmanagedChild); + + // make it managed again + $this->_em->find(DDC3699Child::CLASSNAME, $id); + + $unmanagedChild->childField = 'modifiedChildValue'; + $unmanagedChild->parentField = 'modifiedParentValue'; + + /* @var $mergedChild DDC3699Child */ + $mergedChild = $this->_em->merge($unmanagedChild); + + $this->assertSame($mergedChild->childField, 'modifiedChildValue'); + $this->assertSame($mergedChild->parentField, 'modifiedParentValue'); + } +} \ No newline at end of file diff --git a/tests/Doctrine/Tests/OrmFunctionalTestCase.php b/tests/Doctrine/Tests/OrmFunctionalTestCase.php index f48d635f2..855fac617 100644 --- a/tests/Doctrine/Tests/OrmFunctionalTestCase.php +++ b/tests/Doctrine/Tests/OrmFunctionalTestCase.php @@ -139,6 +139,12 @@ abstract class OrmFunctionalTestCase extends OrmTestCase 'Doctrine\Tests\Models\DDC117\DDC117Editor', 'Doctrine\Tests\Models\DDC117\DDC117Link', ), + 'ddc3699' => array( + 'Doctrine\Tests\Models\DDC3699\DDC3699Parent', + 'Doctrine\Tests\Models\DDC3699\DDC3699RelationOne', + 'Doctrine\Tests\Models\DDC3699\DDC3699RelationMany', + 'Doctrine\Tests\Models\DDC3699\DDC3699Child', + ), 'stockexchange' => array( 'Doctrine\Tests\Models\StockExchange\Bond', 'Doctrine\Tests\Models\StockExchange\Stock',