From 9ea03de84fc5afbc83c02ec389ba874731467281 Mon Sep 17 00:00:00 2001 From: Benjamin Eberlei Date: Tue, 17 May 2011 23:42:24 +0200 Subject: [PATCH] DDC-1080 - Fix bug with hydration of derived entities/foreign key as primary key. --- .../Internal/Hydration/AbstractHydrator.php | 2 +- .../ORM/Persisters/BasicEntityPersister.php | 2 +- lib/Doctrine/ORM/Query/ResultSetMapping.php | 19 ++++++++++--- lib/Doctrine/ORM/Query/SqlWalker.php | 27 ++----------------- 4 files changed, 19 insertions(+), 31 deletions(-) diff --git a/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php index a9697c15a..4bc53f738 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php @@ -195,7 +195,7 @@ abstract class AbstractHydrator $cache[$key]['fieldName'] = $fieldName; $cache[$key]['dqlAlias'] = $this->_rsm->columnOwnerMap[$key]; $classMetadata = $this->_em->getClassMetadata($this->_rsm->aliasMap[$cache[$key]['dqlAlias']]); - $cache[$key]['isIdentifier'] = $classMetadata->isIdentifier($fieldName); + $cache[$key]['isIdentifier'] = isset($this->_rsm->isIdentifierColumn[$cache[$key]['dqlAlias']][$key]); } } diff --git a/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php b/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php index 454078dfe..5ce7080c2 100644 --- a/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php +++ b/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php @@ -989,7 +989,7 @@ class BasicEntityPersister $columnAlias = $srcColumn . $this->_sqlAliasCounter++; $columnList .= $this->_getSQLTableAlias($class->name, ($alias == 'r' ? '' : $alias) ) . ".$srcColumn AS $columnAlias"; $resultColumnName = $this->_platform->getSQLResultCasing($columnAlias); - $this->_rsm->addMetaResult($alias, $this->_platform->getSQLResultCasing($columnAlias), $srcColumn); + $this->_rsm->addMetaResult($alias, $this->_platform->getSQLResultCasing($columnAlias), $srcColumn, isset($assoc['id']) && $assoc['id'] === true); } } return $columnList; diff --git a/lib/Doctrine/ORM/Query/ResultSetMapping.php b/lib/Doctrine/ORM/Query/ResultSetMapping.php index b10b0d15d..3a086e2cd 100644 --- a/lib/Doctrine/ORM/Query/ResultSetMapping.php +++ b/lib/Doctrine/ORM/Query/ResultSetMapping.php @@ -112,6 +112,13 @@ class ResultSetMapping * @var array */ public $declaringClasses = array(); + + /** + * This is necessary to hydrate derivate foreign keys correctly. + * + * @var array + */ + public $isIdentifierColumn = array(); /** * Adds an entity result to this ResultSetMapping. @@ -381,13 +388,17 @@ class ResultSetMapping /** * Adds a meta column (foreign key or discriminator column) to the result set. * - * @param $alias - * @param $columnName - * @param $fieldName + * @param string $alias + * @param string $columnName + * @param string $fieldName + * @param bool */ - public function addMetaResult($alias, $columnName, $fieldName) + public function addMetaResult($alias, $columnName, $fieldName, $isIdentifierColumn = false) { $this->metaMappings[$columnName] = $fieldName; $this->columnOwnerMap[$columnName] = $alias; + if ($isIdentifierColumn) { + $this->isIdentifierColumn[$alias][$columnName] = true; + } } } \ No newline at end of file diff --git a/lib/Doctrine/ORM/Query/SqlWalker.php b/lib/Doctrine/ORM/Query/SqlWalker.php index 0b5cfbef0..611cd0a1d 100644 --- a/lib/Doctrine/ORM/Query/SqlWalker.php +++ b/lib/Doctrine/ORM/Query/SqlWalker.php @@ -576,7 +576,7 @@ class SqlWalker implements TreeWalker $columnAlias = $this->getSQLColumnAlias($srcColumn); $sql .= ", $sqlTableAlias." . $srcColumn . ' AS ' . $columnAlias; $columnAlias = $this->_platform->getSQLResultCasing($columnAlias); - $this->_rsm->addMetaResult($dqlAlias, $this->_platform->getSQLResultCasing($columnAlias), $srcColumn); + $this->_rsm->addMetaResult($dqlAlias, $this->_platform->getSQLResultCasing($columnAlias), $srcColumn, (isset($assoc['id']) && $assoc['id'] === true)); } } } @@ -591,7 +591,7 @@ class SqlWalker implements TreeWalker $columnAlias = $this->getSQLColumnAlias($srcColumn); $sql .= ', ' . $sqlTableAlias . '.' . $srcColumn . ' AS ' . $columnAlias; $columnAlias = $this->_platform->getSQLResultCasing($columnAlias); - $this->_rsm->addMetaResult($dqlAlias, $this->_platform->getSQLResultCasing($columnAlias), $srcColumn); + $this->_rsm->addMetaResult($dqlAlias, $this->_platform->getSQLResultCasing($columnAlias), $srcColumn, (isset($assoc['id']) && $assoc['id'] === true)); } } } @@ -1021,29 +1021,6 @@ class SqlWalker implements TreeWalker $this->_rsm->addFieldResult($dqlAlias, $columnAlias, $fieldName, $class->name); } - if ($class->containsForeignIdentifier) { - // Add double entry for association identifier columns to simplify hydrator code - foreach ($class->identifier AS $idField) { - if (isset($class->associationMappings[$idField])) { - if (isset($mapping['inherited'])) { - $tableName = $this->_em->getClassMetadata($mapping['inherited'])->table['name']; - } else { - $tableName = $class->table['name']; - } - - if ($beginning) $beginning = false; else $sql .= ', '; - - $joinColumnName = $class->associationMappings[$idField]['joinColumns'][0]['name']; - $sqlTableAlias = $this->getSQLTableAlias($tableName, $dqlAlias); - $columnAlias = $this->getSQLColumnAlias($joinColumnName); - $sql .= $sqlTableAlias . '.' . $joinColumnName . ' AS ' . $columnAlias; - - $columnAlias = $this->_platform->getSQLResultCasing($columnAlias); - $this->_rsm->addMetaResult($dqlAlias, $columnAlias, $idField); - } - } - } - // Add any additional fields of subclasses (excluding inherited fields) // 1) on Single Table Inheritance: always, since its marginal overhead // 2) on Class Table Inheritance only if partial objects are disallowed,