From 1b46208aa5d57993601b70a2f53aa78da8739520 Mon Sep 17 00:00:00 2001 From: Benjamin Eberlei Date: Tue, 15 Mar 2011 21:34:47 +0100 Subject: [PATCH] [DDC-952] More fixes --- .../Hydration/SimpleObjectHydrator.php | 62 ++++++++++--------- .../ORM/Persisters/BasicEntityPersister.php | 8 ++- .../Tests/ORM/Functional/TypeTest.php | 2 +- 3 files changed, 41 insertions(+), 31 deletions(-) diff --git a/lib/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php index eb6717b30..54b39d90f 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php @@ -52,7 +52,7 @@ class SimpleObjectHydrator extends AbstractHydrator protected function _prepare() { if (count($this->_rsm->aliasMap) == 1) { - $this->class = $this->_em->getClassMetadata(current($this->_rsm->aliasMap)); + $this->class = $this->_em->getClassMetadata(reset($this->_rsm->aliasMap)); if ($this->class->inheritanceType !== ClassMetadata::INHERITANCE_TYPE_NONE) { foreach ($this->_rsm->declaringClasses AS $column => $class) { $this->declaringClasses[$column] = $this->_em->getClassMetadata($class); @@ -72,19 +72,20 @@ class SimpleObjectHydrator extends AbstractHydrator if ($this->class->inheritanceType == ClassMetadata::INHERITANCE_TYPE_NONE) { foreach ($sqlResult as $column => $value) { - if (isset($this->_rsm->fieldMappings[$column])) { - $column = $this->_rsm->fieldMappings[$column]; - $field = $this->class->fieldNames[$column]; - if (isset($data[$field])) { - $data[$column] = $value; + if (!isset($cache[$column])) { + if (isset($this->_rsm->fieldMappings[$column])) { + $cache[$column]['name'] = $this->_rsm->fieldMappings[$column]; + $cache[$column]['field'] = true; } else { - $data[$field] = Type::getType($this->class->fieldMappings[$field]['type']) - ->convertToPHPValue($value, $this->_platform); + $cache[$column]['name'] = $this->_rsm->metaMappings[$column]; } - } else { - $column = $this->_rsm->metaMappings[$column]; - $data[$column] = $value; } + + if (isset($cache[$column]['field'])) { + $value = Type::getType($this->class->fieldMappings[$cache[$column]['name']]['type']) + ->convertToPHPValue($value, $this->_platform); + } + $data[$cache[$column]['name']] = $value; } $entityName = $this->class->name; } else { @@ -92,25 +93,30 @@ class SimpleObjectHydrator extends AbstractHydrator $entityName = $this->class->discriminatorMap[$sqlResult[$discrColumnName]]; unset($sqlResult[$discrColumnName]); foreach ($sqlResult as $column => $value) { - if (isset($this->_rsm->fieldMappings[$column])) { - $realColumnName = $this->_rsm->fieldMappings[$column]; - $class = $this->declaringClasses[$column]; - if ($class->name == $entityName || is_subclass_of($entityName, $class->name)) { - $field = $class->fieldNames[$realColumnName]; - if (isset($data[$field])) { - $data[$realColumnName] = $value; - } else { - $data[$field] = Type::getType($class->fieldMappings[$field]['type']) - ->convertToPHPValue($value, $this->_platform); + if (!isset($cache[$column])) { + if (isset($this->_rsm->fieldMappings[$column])) { + $field = $this->_rsm->fieldMappings[$column]; + $class = $this->declaringClasses[$column]; + if ($class->name == $entityName || is_subclass_of($entityName, $class->name)) { + $cache[$column]['name'] = $field; + $cache[$column]['class'] = $class; } + } else if (isset($this->_rsm->relationMap[$column])) { + if ($this->_rsm->relationMap[$column] == $entityName || is_subclass_of($entityName, $this->_rsm->relationMap[$column])) { + $cache[$column]['name'] = $field; + } + } else { + $cache[$column]['name'] = $this->_rsm->metaMappings[$column]; } - } else if (isset($this->_rsm->relationMap[$column])) { - if ($this->_rsm->relationMap[$column] == $entityName || is_subclass_of($entityName, $this->_rsm->relationMap[$column])) { - $data[$realColumnName] = $value; - } - } else { - $column = $this->_rsm->metaMappings[$column]; - $data[$realColumnName] = $value; + } + + if (isset($cache[$column]['class'])) { + $value = Type::getType($cache[$column]['class']->fieldMappings[$cache[$column]['name']]['type']) + ->convertToPHPValue($value, $this->_platform); + } + + if (isset($cache[$column])) { + $data[$cache[$column]['name']] = $value; } } } diff --git a/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php b/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php index 9671f945a..6999f85ce 100644 --- a/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php +++ b/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php @@ -571,8 +571,12 @@ class BasicEntityPersister if ($entity !== null) { $hints[Query::HINT_REFRESH] = true; } - - $hydrator = $this->_em->newHydrator(Query::HYDRATE_OBJECT); + + if ($this->_selectJoinSql) { + $hydrator = $this->_em->newHydrator(Query::HYDRATE_OBJECT); + } else { + $hydrator = $this->_em->newHydrator(Query::HYDRATE_SIMPLEOBJECT); + } $entities = $hydrator->hydrateAll($stmt, $this->_rsm, $hints); return $entities ? $entities[0] : null; } diff --git a/tests/Doctrine/Tests/ORM/Functional/TypeTest.php b/tests/Doctrine/Tests/ORM/Functional/TypeTest.php index 8ecee7ac7..a2a738b56 100644 --- a/tests/Doctrine/Tests/ORM/Functional/TypeTest.php +++ b/tests/Doctrine/Tests/ORM/Functional/TypeTest.php @@ -119,7 +119,7 @@ class TypeTest extends \Doctrine\Tests\OrmFunctionalTestCase $dateTimeDb = $this->_em->find('Doctrine\Tests\Models\Generic\DateTimeModel', $dateTime->id); - $this->assertInstanceOf('DateTime', $dateTime->datetime); + $this->assertInstanceOf('DateTime', $dateTimeDb->datetime); $this->assertEquals('2009-10-02 20:10:52', $dateTimeDb->datetime->format('Y-m-d H:i:s')); }