1
0
mirror of synced 2025-02-21 22:53:15 +03:00

Merge branch 'PR39'

This commit is contained in:
Benjamin Eberlei 2011-05-01 00:18:22 +02:00
commit e3d2a0e293
2 changed files with 35 additions and 12 deletions

View File

@ -39,9 +39,9 @@ class ObjectHydrator extends AbstractHydrator
* This local cache is maintained between hydration runs and not cleared. * This local cache is maintained between hydration runs and not cleared.
*/ */
private $_ce = array(); private $_ce = array();
/* The following parts are reinitialized on every hydration run. */ /* The following parts are reinitialized on every hydration run. */
private $_identifierMap; private $_identifierMap;
private $_resultPointers; private $_resultPointers;
private $_idTemplate; private $_idTemplate;
@ -50,7 +50,7 @@ class ObjectHydrator extends AbstractHydrator
private $_initializedCollections = array(); private $_initializedCollections = array();
private $_existingCollections = array(); private $_existingCollections = array();
//private $_createdEntities; //private $_createdEntities;
/** @override */ /** @override */
protected function _prepare() protected function _prepare()
@ -71,10 +71,14 @@ class ObjectHydrator extends AbstractHydrator
if ( ! isset($this->_ce[$className])) { if ( ! isset($this->_ce[$className])) {
$this->_ce[$className] = $class; $this->_ce[$className] = $class;
} }
// Remember which associations are "fetch joined", so that we know where to inject // Remember which associations are "fetch joined", so that we know where to inject
// collection stubs or proxies and where not. // collection stubs or proxies and where not.
if (isset($this->_rsm->relationMap[$dqlAlias])) { if (isset($this->_rsm->relationMap[$dqlAlias])) {
if ( ! isset($this->_rsm->aliasMap[$this->_rsm->parentAliasMap[$dqlAlias]])) {
throw HydrationException::parentObjectOfRelationNotFound($dqlAlias, $this->_rsm->parentAliasMap[$dqlAlias]);
}
$sourceClassName = $this->_rsm->aliasMap[$this->_rsm->parentAliasMap[$dqlAlias]]; $sourceClassName = $this->_rsm->aliasMap[$this->_rsm->parentAliasMap[$dqlAlias]];
$sourceClass = $this->_getClassMetadata($sourceClassName); $sourceClass = $this->_getClassMetadata($sourceClassName);
$assoc = $sourceClass->associationMappings[$this->_rsm->relationMap[$dqlAlias]]; $assoc = $sourceClass->associationMappings[$this->_rsm->relationMap[$dqlAlias]];
@ -185,7 +189,7 @@ class ObjectHydrator extends AbstractHydrator
return $value; return $value;
} }
/** /**
* Gets an entity instance. * Gets an entity instance.
* *
@ -195,7 +199,7 @@ class ObjectHydrator extends AbstractHydrator
*/ */
private function _getEntity(array $data, $dqlAlias) private function _getEntity(array $data, $dqlAlias)
{ {
$className = $this->_rsm->aliasMap[$dqlAlias]; $className = $this->_rsm->aliasMap[$dqlAlias];
if (isset($this->_rsm->discriminatorColumns[$dqlAlias])) { if (isset($this->_rsm->discriminatorColumns[$dqlAlias])) {
$discrColumn = $this->_rsm->metaMappings[$this->_rsm->discriminatorColumns[$dqlAlias]]; $discrColumn = $this->_rsm->metaMappings[$this->_rsm->discriminatorColumns[$dqlAlias]];
$className = $this->_ce[$className]->discriminatorMap[$data[$discrColumn]]; $className = $this->_ce[$className]->discriminatorMap[$data[$discrColumn]];
@ -203,7 +207,7 @@ class ObjectHydrator extends AbstractHydrator
} }
return $this->_uow->createEntity($className, $data, $this->_hints); return $this->_uow->createEntity($className, $data, $this->_hints);
} }
private function _getEntityFromIdentityMap($className, array $data) private function _getEntityFromIdentityMap($className, array $data)
{ {
$class = $this->_ce[$className]; $class = $this->_ce[$className];
@ -217,7 +221,7 @@ class ObjectHydrator extends AbstractHydrator
return $this->_uow->tryGetByIdHash($data[$class->identifier[0]], $class->rootEntityName); return $this->_uow->tryGetByIdHash($data[$class->identifier[0]], $class->rootEntityName);
} }
} }
/** /**
* Gets a ClassMetadata instance from the local cache. * Gets a ClassMetadata instance from the local cache.
* If the instance is not yet in the local cache, it is loaded into the * If the instance is not yet in the local cache, it is loaded into the
@ -275,7 +279,7 @@ class ObjectHydrator extends AbstractHydrator
// Hydrate the data chunks // Hydrate the data chunks
foreach ($rowData as $dqlAlias => $data) { foreach ($rowData as $dqlAlias => $data) {
$entityName = $this->_rsm->aliasMap[$dqlAlias]; $entityName = $this->_rsm->aliasMap[$dqlAlias];
if (isset($this->_rsm->parentAliasMap[$dqlAlias])) { if (isset($this->_rsm->parentAliasMap[$dqlAlias])) {
// It's a joined result // It's a joined result
@ -286,7 +290,7 @@ class ObjectHydrator extends AbstractHydrator
// Get a reference to the parent object to which the joined element belongs. // Get a reference to the parent object to which the joined element belongs.
if ($this->_rsm->isMixed && isset($this->_rootAliases[$parentAlias])) { if ($this->_rsm->isMixed && isset($this->_rootAliases[$parentAlias])) {
$first = reset($this->_resultPointers); $first = reset($this->_resultPointers);
$parentObject = $this->_resultPointers[$parentAlias][key($first)]; $parentObject = $this->_resultPointers[$parentAlias][key($first)];
} else if (isset($this->_resultPointers[$parentAlias])) { } else if (isset($this->_resultPointers[$parentAlias])) {
$parentObject = $this->_resultPointers[$parentAlias]; $parentObject = $this->_resultPointers[$parentAlias];
@ -311,11 +315,11 @@ class ObjectHydrator extends AbstractHydrator
} else if ( ! isset($this->_existingCollections[$collKey])) { } else if ( ! isset($this->_existingCollections[$collKey])) {
$reflFieldValue = $this->_initRelatedCollection($parentObject, $parentClass, $relationField); $reflFieldValue = $this->_initRelatedCollection($parentObject, $parentClass, $relationField);
} }
$indexExists = isset($this->_identifierMap[$path][$id[$parentAlias]][$id[$dqlAlias]]); $indexExists = isset($this->_identifierMap[$path][$id[$parentAlias]][$id[$dqlAlias]]);
$index = $indexExists ? $this->_identifierMap[$path][$id[$parentAlias]][$id[$dqlAlias]] : false; $index = $indexExists ? $this->_identifierMap[$path][$id[$parentAlias]][$id[$dqlAlias]] : false;
$indexIsValid = $index !== false ? isset($reflFieldValue[$index]) : false; $indexIsValid = $index !== false ? isset($reflFieldValue[$index]) : false;
if ( ! $indexExists || ! $indexIsValid) { if ( ! $indexExists || ! $indexIsValid) {
if (isset($this->_existingCollections[$collKey])) { if (isset($this->_existingCollections[$collKey])) {
// Collection exists, only look for the element in the identity map. // Collection exists, only look for the element in the identity map.

View File

@ -246,5 +246,24 @@ class NativeQueryTest extends \Doctrine\Tests\OrmFunctionalTestCase
$rsm->addRootEntityFromClassMetadata('Doctrine\Tests\Models\CMS\CmsUser', 'u'); $rsm->addRootEntityFromClassMetadata('Doctrine\Tests\Models\CMS\CmsUser', 'u');
$rsm->addJoinedEntityFromClassMetadata('Doctrine\Tests\Models\CMS\CmsAddress', 'a', 'u', 'address'); $rsm->addJoinedEntityFromClassMetadata('Doctrine\Tests\Models\CMS\CmsAddress', 'a', 'u', 'address');
} }
/**
* @group PR-39
*/
public function testUnknownParentAliasThrowsException()
{
$rsm = new ResultSetMappingBuilder($this->_em);
$rsm->addRootEntityFromClassMetadata('Doctrine\Tests\Models\CMS\CmsUser', 'u');
$rsm->addJoinedEntityFromClassMetadata('Doctrine\Tests\Models\CMS\CmsAddress', 'a', 'un', 'address', array('id' => 'a_id'));
$query = $this->_em->createNativeQuery('SELECT u.*, a.*, a.id AS a_id FROM cms_users u INNER JOIN cms_addresses a ON u.id = a.user_id WHERE u.username = ?', $rsm);
$query->setParameter(1, 'romanb');
$this->setExpectedException(
"Doctrine\ORM\Internal\Hydration\HydrationException",
"The parent object of entity result with alias 'a' was not found. The parent alias is 'un'."
);
$users = $query->getResult();
}
} }