From df19e68a8613b783591631f64851cc1f6a8c4dbf Mon Sep 17 00:00:00 2001 From: "Fabio B. Silva" Date: Wed, 7 Dec 2011 11:23:15 -0200 Subject: [PATCH 1/9] Fixed DDC-1057 --- lib/Doctrine/ORM/Query/ResultSetMapping.php | 31 ++++++++++++++-- .../ORM/Hydration/ResultSetMappingTest.php | 37 +++++++++++++++++++ 2 files changed, 65 insertions(+), 3 deletions(-) diff --git a/lib/Doctrine/ORM/Query/ResultSetMapping.php b/lib/Doctrine/ORM/Query/ResultSetMapping.php index 5c6305e25..68713a7cc 100644 --- a/lib/Doctrine/ORM/Query/ResultSetMapping.php +++ b/lib/Doctrine/ORM/Query/ResultSetMapping.php @@ -120,6 +120,7 @@ class ResultSetMapping * results or joined entity results within this ResultSetMapping. * @param string $resultAlias The result alias with which the entity result should be * placed in the result structure. + * @return ResultSetMapping This ResultSetMapping instance. * * @todo Rename: addRootEntity */ @@ -131,6 +132,8 @@ class ResultSetMapping if ($resultAlias !== null) { $this->isMixed = true; } + + return $this; } /** @@ -141,13 +144,16 @@ class ResultSetMapping * @param string $alias The alias of the entity result or joined entity result the discriminator * column should be used for. * @param string $discrColumn The name of the discriminator column in the SQL result set. - * + * @return ResultSetMapping This ResultSetMapping instance. + * * @todo Rename: addDiscriminatorColumn */ public function setDiscriminatorColumn($alias, $discrColumn) { $this->discriminatorColumns[$alias] = $discrColumn; $this->columnOwnerMap[$discrColumn] = $alias; + + return $this; } /** @@ -155,6 +161,7 @@ class ResultSetMapping * * @param string $alias The alias of an entity result or joined entity result. * @param string $fieldName The name of the field to use for indexing. + * @return ResultSetMapping This ResultSetMapping instance. */ public function addIndexBy($alias, $fieldName) { @@ -168,6 +175,8 @@ class ResultSetMapping break; } + + return $this; /* TODO: check if this exception can be put back, for now it's gone because of assumptions made by some ORM internals if ( ! $found) { @@ -186,11 +195,13 @@ class ResultSetMapping * Set to index by a scalar result column name * * @param $resultColumnName - * @return void + * @return ResultSetMapping This ResultSetMapping instance. */ public function addIndexByScalar($resultColumnName) { $this->indexByMap['scalars'] = $resultColumnName; + + return $this; } /** @@ -198,11 +209,13 @@ class ResultSetMapping * * @param $alias * @param $resultColumnName - * @return void + * @return ResultSetMapping This ResultSetMapping instance. */ public function addIndexByColumn($alias, $resultColumnName) { $this->indexByMap[$alias] = $resultColumnName; + + return $this; } /** @@ -242,6 +255,7 @@ class ResultSetMapping * the field $fieldName is defined on a subclass, specify that here. * If not specified, the field is assumed to belong to the class * designated by $alias. + * @return ResultSetMapping This ResultSetMapping instance. * @todo Rename: addField */ public function addFieldResult($alias, $columnName, $fieldName, $declaringClass = null) @@ -256,6 +270,8 @@ class ResultSetMapping if ( ! $this->isMixed && $this->scalarMappings) { $this->isMixed = true; } + + return $this; } /** @@ -265,6 +281,7 @@ class ResultSetMapping * @param string $alias The unique alias to use for the joined entity. * @param string $parentAlias The alias of the entity result that is the parent of this joined result. * @param object $relation The association field that connects the parent entity result with the joined entity result. + * @return ResultSetMapping This ResultSetMapping instance. * @todo Rename: addJoinedEntity */ public function addJoinedEntityResult($class, $alias, $parentAlias, $relation) @@ -272,6 +289,8 @@ class ResultSetMapping $this->aliasMap[$alias] = $class; $this->parentAliasMap[$alias] = $parentAlias; $this->relationMap[$alias] = $relation; + + return $this; } /** @@ -279,6 +298,7 @@ class ResultSetMapping * * @param string $columnName The name of the column in the SQL result set. * @param string $alias The result alias with which the scalar result should be placed in the result structure. + * @return ResultSetMapping This ResultSetMapping instance. * @todo Rename: addScalar */ public function addScalarResult($columnName, $alias) @@ -288,6 +308,8 @@ class ResultSetMapping if ( ! $this->isMixed && $this->fieldMappings) { $this->isMixed = true; } + + return $this; } /** @@ -439,6 +461,7 @@ class ResultSetMapping * @param string $columnName * @param string $fieldName * @param bool + * @return ResultSetMapping This ResultSetMapping instance. */ public function addMetaResult($alias, $columnName, $fieldName, $isIdentifierColumn = false) { @@ -448,5 +471,7 @@ class ResultSetMapping if ($isIdentifierColumn) { $this->isIdentifierColumn[$alias][$columnName] = true; } + + return $this; } } diff --git a/tests/Doctrine/Tests/ORM/Hydration/ResultSetMappingTest.php b/tests/Doctrine/Tests/ORM/Hydration/ResultSetMappingTest.php index 562fd4d87..d18c4dbb7 100644 --- a/tests/Doctrine/Tests/ORM/Hydration/ResultSetMappingTest.php +++ b/tests/Doctrine/Tests/ORM/Hydration/ResultSetMappingTest.php @@ -14,7 +14,14 @@ require_once __DIR__ . '/../../TestInit.php'; */ class ResultSetMappingTest extends \Doctrine\Tests\OrmTestCase { + /** + * @var ResultSetMapping + */ private $_rsm; + + /** + * @var \Doctrine\ORM\EntityManager + */ private $_em; protected function setUp() { @@ -56,5 +63,35 @@ class ResultSetMappingTest extends \Doctrine\Tests\OrmTestCase $this->assertEquals('username', $this->_rsm->getFieldName('username')); $this->assertEquals('name', $this->_rsm->getFieldName('name')); } + + /** + * @group DDC-1057 + * + * Fluent interface test, not a real result set mapping + */ + public function testFluentInterface() + { + $rms = $this->_rsm; + + $rms->addEntityResult('Doctrine\Tests\Models\CMS\CmsUser','u') + ->addJoinedEntityResult('Doctrine\Tests\Models\CMS\CmsPhonenumber','p','u','phonenumbers') + ->addFieldResult('u', 'id', 'id') + ->addFieldResult('u', 'name', 'name') + ->setDiscriminatorColumn('name', 'name') + ->addIndexByColumn('id', 'id') + ->addIndexBy('username', 'username') + ->addIndexByScalar('sclr0') + ->addScalarResult('sclr0', 'numPhones') + ->addMetaResult('a', 'user_id', 'user_id'); + + + $this->assertTrue($rms->hasIndexBy('id')); + $this->assertTrue($rms->isFieldResult('id')); + $this->assertTrue($rms->isFieldResult('name')); + $this->assertTrue($rms->isScalarResult('sclr0')); + $this->assertTrue($rms->isRelation('p')); + $this->assertTrue($rms->hasParentAlias('p')); + $this->assertTrue($rms->isMixedResult()); + } } From c6a89c64f30527625097f5e440fa6a9c559d42a3 Mon Sep 17 00:00:00 2001 From: "Fabio B. Silva" Date: Wed, 7 Dec 2011 12:16:27 -0200 Subject: [PATCH 2/9] put return after comment --- lib/Doctrine/ORM/Query/ResultSetMapping.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Doctrine/ORM/Query/ResultSetMapping.php b/lib/Doctrine/ORM/Query/ResultSetMapping.php index 68713a7cc..239f79c9e 100644 --- a/lib/Doctrine/ORM/Query/ResultSetMapping.php +++ b/lib/Doctrine/ORM/Query/ResultSetMapping.php @@ -176,8 +176,6 @@ class ResultSetMapping break; } - return $this; - /* TODO: check if this exception can be put back, for now it's gone because of assumptions made by some ORM internals if ( ! $found) { $message = sprintf( @@ -189,6 +187,8 @@ class ResultSetMapping throw new \LogicException($message); } */ + + return $this; } /** From 8e50a31b98e1a7ceaab89f54e9c18b684c911514 Mon Sep 17 00:00:00 2001 From: "Fabio B. Silva" Date: Wed, 7 Dec 2011 12:31:23 -0200 Subject: [PATCH 3/9] trying remove whitespaces --- lib/Doctrine/ORM/Query/ResultSetMapping.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/Doctrine/ORM/Query/ResultSetMapping.php b/lib/Doctrine/ORM/Query/ResultSetMapping.php index 239f79c9e..3c292fda4 100644 --- a/lib/Doctrine/ORM/Query/ResultSetMapping.php +++ b/lib/Doctrine/ORM/Query/ResultSetMapping.php @@ -121,7 +121,6 @@ class ResultSetMapping * @param string $resultAlias The result alias with which the entity result should be * placed in the result structure. * @return ResultSetMapping This ResultSetMapping instance. - * * @todo Rename: addRootEntity */ public function addEntityResult($class, $alias, $resultAlias = null) @@ -145,7 +144,6 @@ class ResultSetMapping * column should be used for. * @param string $discrColumn The name of the discriminator column in the SQL result set. * @return ResultSetMapping This ResultSetMapping instance. - * * @todo Rename: addDiscriminatorColumn */ public function setDiscriminatorColumn($alias, $discrColumn) @@ -175,7 +173,7 @@ class ResultSetMapping break; } - + /* TODO: check if this exception can be put back, for now it's gone because of assumptions made by some ORM internals if ( ! $found) { $message = sprintf( From 0febf0611439e05abbb1bf4b4e9668f7ad125c67 Mon Sep 17 00:00:00 2001 From: Guilherme Blanco Date: Fri, 9 Dec 2011 00:04:47 -0500 Subject: [PATCH 4/9] Made ClassMetadataBuilder support ClassMetadataInfo instead of ClassMetadata. Fixed DDC-1508. --- .../Mapping/Builder/ClassMetadataBuilder.php | 97 +++++++++++++++---- 1 file changed, 80 insertions(+), 17 deletions(-) diff --git a/lib/Doctrine/ORM/Mapping/Builder/ClassMetadataBuilder.php b/lib/Doctrine/ORM/Mapping/Builder/ClassMetadataBuilder.php index 978a87601..f7d5031cd 100644 --- a/lib/Doctrine/ORM/Mapping/Builder/ClassMetadataBuilder.php +++ b/lib/Doctrine/ORM/Mapping/Builder/ClassMetadataBuilder.php @@ -19,7 +19,8 @@ namespace Doctrine\ORM\Mapping\Builder; -use Doctrine\ORM\Mapping\ClassMetadata; +use Doctrine\ORM\Mapping\ClassMetadata, + Doctrine\ORM\Mapping\ClassMetadataInfo; /** * Builder Object for ClassMetadata @@ -28,18 +29,19 @@ use Doctrine\ORM\Mapping\ClassMetadata; * @link www.doctrine-project.com * @since 2.2 * @author Benjamin Eberlei + * @author Guilherme Blanco */ class ClassMetadataBuilder { /** - * @var ClassMetadata + * @var \Doctrine\ORM\Mapping\ClassMetadataInfo */ private $cm; /** - * @param ClassMetadata $cm + * @param \Doctrine\ORM\Mapping\ClassMetadataInfo $cm */ - public function __construct(ClassMetadata $cm) + public function __construct(ClassMetadataInfo $cm) { $this->cm = $cm; } @@ -60,6 +62,7 @@ class ClassMetadataBuilder public function setMappedSuperClass() { $this->cm->isMappedSuperclass = true; + return $this; } @@ -72,6 +75,7 @@ class ClassMetadataBuilder public function setCustomRepositoryClass($repositoryClassName) { $this->cm->setCustomRepositoryClass($repositoryClassName); + return $this; } @@ -83,6 +87,7 @@ class ClassMetadataBuilder public function setReadOnly() { $this->cm->markReadOnly(); + return $this; } @@ -95,6 +100,7 @@ class ClassMetadataBuilder public function setTable($name) { $this->cm->setPrimaryTable(array('name' => $name)); + return $this; } @@ -110,7 +116,9 @@ class ClassMetadataBuilder if (!isset($this->cm->table['indexes'])) { $this->cm->table['indexes'] = array(); } + $this->cm->table['indexes'][$name] = array('columns' => $columns); + return $this; } @@ -123,10 +131,12 @@ class ClassMetadataBuilder */ public function addUniqueConstraint(array $columns, $name) { - if (!isset($this->cm->table['uniqueConstraints'])) { + if ( ! isset($this->cm->table['uniqueConstraints'])) { $this->cm->table['uniqueConstraints'] = array(); } + $this->cm->table['uniqueConstraints'][$name] = array('columns' => $columns); + return $this; } @@ -143,6 +153,7 @@ class ClassMetadataBuilder 'name' => $name, 'query' => $dqlQuery, )); + return $this; } @@ -154,6 +165,7 @@ class ClassMetadataBuilder public function setJoinedTableInheritance() { $this->cm->setInheritanceType(ClassMetadata::INHERITANCE_TYPE_JOINED); + return $this; } @@ -165,6 +177,7 @@ class ClassMetadataBuilder public function setSingleTableInheritance() { $this->cm->setInheritanceType(ClassMetadata::INHERITANCE_TYPE_SINGLE_TABLE); + return $this; } @@ -181,12 +194,13 @@ class ClassMetadataBuilder 'type' => $type, 'length' => $length, )); + return $this; } /** * Add a subclass to this inheritance hierachy. - * + * * @param string $name * @param string $class * @return ClassMetadataBuilder @@ -194,6 +208,7 @@ class ClassMetadataBuilder public function addDiscriminatorMapClass($name, $class) { $this->cm->addDiscriminatorMapClass($name, $class); + return $this; } @@ -205,6 +220,7 @@ class ClassMetadataBuilder public function setChangeTrackingPolicyDeferredExplicit() { $this->cm->setChangeTrackingPolicy(ClassMetadata::CHANGETRACKING_DEFERRED_EXPLICIT); + return $this; } @@ -216,12 +232,13 @@ class ClassMetadataBuilder public function setChangeTrackingPolicyNotify() { $this->cm->setChangeTrackingPolicy(ClassMetadata::CHANGETRACKING_NOTIFY); + return $this; } /** * Add lifecycle event - * + * * @param string $methodName * @param string $event * @return ClassMetadataBuilder @@ -229,6 +246,7 @@ class ClassMetadataBuilder public function addLifecycleEvent($methodName, $event) { $this->cm->addLifecycleCallback($methodName, $event); + return $this; } @@ -243,7 +261,9 @@ class ClassMetadataBuilder { $mapping['fieldName'] = $name; $mapping['type'] = $type; + $this->cm->mapField($mapping); + return $this; } @@ -256,12 +276,18 @@ class ClassMetadataBuilder */ public function createField($name, $type) { - return new FieldBuilder($this, array('fieldName' => $name, 'type' => $type)); + return new FieldBuilder( + $this, + array( + 'fieldName' => $name, + 'type' => $type + ) + ); } /** * Add a simple many to one association, optionally with the inversed by field. - * + * * @param string $name * @param string $targetEntity * @param string|null $inversedBy @@ -270,9 +296,11 @@ class ClassMetadataBuilder public function addManyToOne($name, $targetEntity, $inversedBy = null) { $builder = $this->createManyToOne($name, $targetEntity); + if ($inversedBy) { $builder->setInversedBy($inversedBy); } + return $builder->build(); } @@ -287,19 +315,33 @@ class ClassMetadataBuilder */ public function createManyToOne($name, $targetEntity) { - return new AssociationBuilder($this, array('fieldName' => $name, 'targetEntity' => $targetEntity), ClassMetadata::MANY_TO_ONE); + return new AssociationBuilder( + $this, + array( + 'fieldName' => $name, + 'targetEntity' => $targetEntity + ), + ClassMetadata::MANY_TO_ONE + ); } /** * Create OneToOne Assocation Builder - * + * * @param string $name * @param string $targetEntity * @return AssociationBuilder */ public function createOneToOne($name, $targetEntity) { - return new AssociationBuilder($this, array('fieldName' => $name, 'targetEntity' => $targetEntity), ClassMetadata::ONE_TO_ONE); + return new AssociationBuilder( + $this, + array( + 'fieldName' => $name, + 'targetEntity' => $targetEntity + ), + ClassMetadata::ONE_TO_ONE + ); } /** @@ -314,6 +356,7 @@ class ClassMetadataBuilder { $builder = $this->createOneToOne($name, $targetEntity); $builder->setMappedBy($mappedBy); + return $builder->build(); } @@ -328,9 +371,11 @@ class ClassMetadataBuilder public function addOwningOneToOne($name, $targetEntity, $inversedBy = null) { $builder = $this->createOneToOne($name, $targetEntity); + if ($inversedBy) { $builder->setInversedBy($inversedBy); } + return $builder->build(); } @@ -343,12 +388,19 @@ class ClassMetadataBuilder */ public function createManyToMany($name, $targetEntity) { - return new ManyToManyAssociationBuilder($this, array('fieldName' => $name, 'targetEntity' => $targetEntity), ClassMetadata::MANY_TO_MANY); + return new ManyToManyAssociationBuilder( + $this, + array( + 'fieldName' => $name, + 'targetEntity' => $targetEntity + ), + ClassMetadata::MANY_TO_MANY + ); } /** * Add a simple owning many to many assocation. - * + * * @param string $name * @param string $targetEntity * @param string|null $inversedBy @@ -357,9 +409,11 @@ class ClassMetadataBuilder public function addOwningManyToMany($name, $targetEntity, $inversedBy = null) { $builder = $this->createManyToMany($name, $targetEntity); + if ($inversedBy) { $builder->setInversedBy($inversedBy); } + return $builder->build(); } @@ -375,24 +429,32 @@ class ClassMetadataBuilder { $builder = $this->createManyToMany($name, $targetEntity); $builder->setMappedBy($mappedBy); + return $builder->build(); } /** * Create a one to many assocation builder - * + * * @param string $name * @param string $targetEntity * @return OneToManyAssociationBuilder */ public function createOneToMany($name, $targetEntity) { - return new OneToManyAssociationBuilder($this, array('fieldName' => $name, 'targetEntity' => $targetEntity), ClassMetadata::ONE_TO_MANY); + return new OneToManyAssociationBuilder( + $this, + array( + 'fieldName' => $name, + 'targetEntity' => $targetEntity + ), + ClassMetadata::ONE_TO_MANY + ); } /** * Add simple OneToMany assocation. - * + * * @param string $name * @param string $targetEntity * @param string $mappedBy @@ -402,6 +464,7 @@ class ClassMetadataBuilder { $builder = $this->createOneToMany($name, $targetEntity); $builder->setMappedBy($mappedBy); + return $builder->build(); } } From 954b5077e495aa9fa4eb54ef4cb8ac309e9415ae Mon Sep 17 00:00:00 2001 From: Guilherme Blanco Date: Fri, 9 Dec 2011 10:59:53 -0500 Subject: [PATCH 5/9] Fixed nesting recursion error in some situations. Complement to DDC-1276. --- lib/Doctrine/ORM/UnitOfWork.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Doctrine/ORM/UnitOfWork.php b/lib/Doctrine/ORM/UnitOfWork.php index 803e6683c..eb3111fb8 100644 --- a/lib/Doctrine/ORM/UnitOfWork.php +++ b/lib/Doctrine/ORM/UnitOfWork.php @@ -1735,7 +1735,7 @@ class UnitOfWork implements PropertyChangedListener $managedCol->initialize(); // clear and set dirty a managed collection if its not also the same collection to merge from. - if (!$managedCol->isEmpty() && $managedCol != $mergeCol) { + if (!$managedCol->isEmpty() && $managedCol !== $mergeCol) { $managedCol->unwrap()->clear(); $managedCol->setDirty(true); From bd0fb574e3ac0a578202b171b83775b9a3bbf953 Mon Sep 17 00:00:00 2001 From: Benjamin Eberlei Date: Sun, 11 Dec 2011 16:07:35 +0100 Subject: [PATCH 6/9] DDC-1515 - Merge from 2.1.x --- .../Internal/Hydration/AbstractHydrator.php | 1 + .../ORM/Internal/Hydration/ObjectHydrator.php | 4 +- .../ORM/Functional/Ticket/DDC1515Test.php | 64 +++++++++++++++++++ 3 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1515Test.php diff --git a/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php index 146dfb5c5..436a93666 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php @@ -244,6 +244,7 @@ abstract class AbstractHydrator if (isset($cache[$key]['isMetaColumn'])) { if ( ! isset($rowData[$dqlAlias][$cache[$key]['fieldName']]) || $value !== null) { + $nonemptyComponents[$dqlAlias] = true; $rowData[$dqlAlias][$cache[$key]['fieldName']] = $value; } diff --git a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php index 36dbfa46a..49737ac58 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php @@ -332,9 +332,9 @@ class ObjectHydrator extends AbstractHydrator // Hydrate the data chunks foreach ($rowData as $dqlAlias => $data) { $entityName = $this->_rsm->aliasMap[$dqlAlias]; - + if (isset($this->_rsm->parentAliasMap[$dqlAlias])) { - // It's a joined result + // It's a joined result $parentAlias = $this->_rsm->parentAliasMap[$dqlAlias]; // we need the $path to save into the identifier map which entities were already diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1515Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1515Test.php new file mode 100644 index 000000000..9bd3360b8 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1515Test.php @@ -0,0 +1,64 @@ +_schemaTool->createSchema(array( + $this->_em->getClassMetadata(__NAMESPACE__ . '\\DDC1515Foo'), + $this->_em->getClassMetadata(__NAMESPACE__ . '\\DDC1515Bar'), + )); + } + + public function testIssue() + { + $bar = new DDC1515Bar(); + $this->_em->persist($bar); + $this->_em->flush(); + + $foo = new DDC1515Foo(); + $foo->bar = $bar; + $this->_em->persist($foo); + $this->_em->flush(); + $this->_em->clear(); + + $bar = $this->_em->find(__NAMESPACE__ . '\DDC1515Bar', $bar->id); + $this->assertInstanceOf(__NAMESPACE__.'\DDC1515Foo', $bar->foo); + } +} + +/** + * @Entity + */ +class DDC1515Foo +{ + /** + * @OneToOne(targetEntity="DDC1515Bar", inversedBy="foo") @Id + */ + public $bar; +} + +/** + * @Entity + */ +class DDC1515Bar +{ + /** + * @Id @Column(type="integer") @GeneratedValue + */ + public $id; + + /** + * @OneToOne(targetEntity="DDC1515Foo", mappedBy="bar") + */ + public $foo; +} + + From 57970499fdd2eb6436494131fba517dde70541a7 Mon Sep 17 00:00:00 2001 From: Benjamin Eberlei Date: Sun, 11 Dec 2011 16:11:16 +0100 Subject: [PATCH 7/9] Revert "DDC-1515 - Merge from 2.1.x" This reverts commit bd0fb574e3ac0a578202b171b83775b9a3bbf953. --- .../Internal/Hydration/AbstractHydrator.php | 1 - .../ORM/Internal/Hydration/ObjectHydrator.php | 4 +- .../ORM/Functional/Ticket/DDC1515Test.php | 64 ------------------- 3 files changed, 2 insertions(+), 67 deletions(-) delete mode 100644 tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1515Test.php diff --git a/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php index 436a93666..146dfb5c5 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php @@ -244,7 +244,6 @@ abstract class AbstractHydrator if (isset($cache[$key]['isMetaColumn'])) { if ( ! isset($rowData[$dqlAlias][$cache[$key]['fieldName']]) || $value !== null) { - $nonemptyComponents[$dqlAlias] = true; $rowData[$dqlAlias][$cache[$key]['fieldName']] = $value; } diff --git a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php index 49737ac58..36dbfa46a 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php @@ -332,9 +332,9 @@ class ObjectHydrator extends AbstractHydrator // Hydrate the data chunks foreach ($rowData as $dqlAlias => $data) { $entityName = $this->_rsm->aliasMap[$dqlAlias]; - + if (isset($this->_rsm->parentAliasMap[$dqlAlias])) { - // It's a joined result + // It's a joined result $parentAlias = $this->_rsm->parentAliasMap[$dqlAlias]; // we need the $path to save into the identifier map which entities were already diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1515Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1515Test.php deleted file mode 100644 index 9bd3360b8..000000000 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1515Test.php +++ /dev/null @@ -1,64 +0,0 @@ -_schemaTool->createSchema(array( - $this->_em->getClassMetadata(__NAMESPACE__ . '\\DDC1515Foo'), - $this->_em->getClassMetadata(__NAMESPACE__ . '\\DDC1515Bar'), - )); - } - - public function testIssue() - { - $bar = new DDC1515Bar(); - $this->_em->persist($bar); - $this->_em->flush(); - - $foo = new DDC1515Foo(); - $foo->bar = $bar; - $this->_em->persist($foo); - $this->_em->flush(); - $this->_em->clear(); - - $bar = $this->_em->find(__NAMESPACE__ . '\DDC1515Bar', $bar->id); - $this->assertInstanceOf(__NAMESPACE__.'\DDC1515Foo', $bar->foo); - } -} - -/** - * @Entity - */ -class DDC1515Foo -{ - /** - * @OneToOne(targetEntity="DDC1515Bar", inversedBy="foo") @Id - */ - public $bar; -} - -/** - * @Entity - */ -class DDC1515Bar -{ - /** - * @Id @Column(type="integer") @GeneratedValue - */ - public $id; - - /** - * @OneToOne(targetEntity="DDC1515Foo", mappedBy="bar") - */ - public $foo; -} - - From f6d2b00d5c85eb916e05fbbbfa3e09d57ee1a003 Mon Sep 17 00:00:00 2001 From: Benjamin Eberlei Date: Sun, 11 Dec 2011 16:42:59 +0100 Subject: [PATCH 8/9] DDC-1400 - var_dump(), seriously? --- tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1400Test.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1400Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1400Test.php index 1639f98bd..2523b5b72 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1400Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1400Test.php @@ -59,12 +59,7 @@ class DDC1400Test extends \Doctrine\Tests\OrmFunctionalTestCase $q->setParameter('activeUser', $user1); $articles = $q->getResult(); - var_dump(array_keys($articles[0]->userStates->toArray())); - $this->_em->flush(); - var_dump($this->_sqlLoggerStack); - - } } From 40d094fea218555429a2c0a7b01216c8f62149c3 Mon Sep 17 00:00:00 2001 From: Benjamin Eberlei Date: Sun, 11 Dec 2011 17:08:58 +0100 Subject: [PATCH 9/9] DDC-1515 - Now the real bugfix --- .../Internal/Hydration/AbstractHydrator.php | 3 + .../ORM/Functional/Ticket/DDC1515Test.php | 64 +++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1515Test.php diff --git a/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php index 146dfb5c5..6c095c9e3 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php @@ -245,6 +245,9 @@ abstract class AbstractHydrator if (isset($cache[$key]['isMetaColumn'])) { if ( ! isset($rowData[$dqlAlias][$cache[$key]['fieldName']]) || $value !== null) { $rowData[$dqlAlias][$cache[$key]['fieldName']] = $value; + if ($cache[$key]['isIdentifier']) { + $nonemptyComponents[$dqlAlias] = true; + } } continue; diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1515Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1515Test.php new file mode 100644 index 000000000..9bd3360b8 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1515Test.php @@ -0,0 +1,64 @@ +_schemaTool->createSchema(array( + $this->_em->getClassMetadata(__NAMESPACE__ . '\\DDC1515Foo'), + $this->_em->getClassMetadata(__NAMESPACE__ . '\\DDC1515Bar'), + )); + } + + public function testIssue() + { + $bar = new DDC1515Bar(); + $this->_em->persist($bar); + $this->_em->flush(); + + $foo = new DDC1515Foo(); + $foo->bar = $bar; + $this->_em->persist($foo); + $this->_em->flush(); + $this->_em->clear(); + + $bar = $this->_em->find(__NAMESPACE__ . '\DDC1515Bar', $bar->id); + $this->assertInstanceOf(__NAMESPACE__.'\DDC1515Foo', $bar->foo); + } +} + +/** + * @Entity + */ +class DDC1515Foo +{ + /** + * @OneToOne(targetEntity="DDC1515Bar", inversedBy="foo") @Id + */ + public $bar; +} + +/** + * @Entity + */ +class DDC1515Bar +{ + /** + * @Id @Column(type="integer") @GeneratedValue + */ + public $id; + + /** + * @OneToOne(targetEntity="DDC1515Foo", mappedBy="bar") + */ + public $foo; +} + +