1
0
mirror of synced 2025-02-02 13:31:45 +03:00

DDC-2931 - Removing refresh hints when fetching association data in hydrators

This commit is contained in:
Marco Pivetta 2014-01-24 02:45:28 +01:00 committed by Benjamin Eberlei
parent f37856829f
commit 0bc94589e1

View File

@ -280,6 +280,71 @@ class ObjectHydrator extends AbstractHydrator
return $this->_uow->createEntity($className, $data, $this->_hints);
}
/**
* Gets an association entity instance.
*
* @param array $data
* @param string $dqlAlias
*
* @return object The associated entity.
*
* @throws HydrationException
*/
private function getAssociatedEntity(array $data, $dqlAlias)
{
$className = $this->_rsm->aliasMap[$dqlAlias];
if (isset($this->_rsm->discriminatorColumns[$dqlAlias])) {
if ( ! isset($this->_rsm->metaMappings[$this->_rsm->discriminatorColumns[$dqlAlias]])) {
throw HydrationException::missingDiscriminatorMetaMappingColumn($className, $this->_rsm->discriminatorColumns[$dqlAlias], $dqlAlias);
}
$discrColumn = $this->_rsm->metaMappings[$this->_rsm->discriminatorColumns[$dqlAlias]];
if ( ! isset($data[$discrColumn])) {
throw HydrationException::missingDiscriminatorColumn($className, $discrColumn, $dqlAlias);
}
if ($data[$discrColumn] === '') {
throw HydrationException::emptyDiscriminatorValue($dqlAlias);
}
$className = $this->ce[$className]->discriminatorMap[$data[$discrColumn]];
unset($data[$discrColumn]);
}
if (isset($this->_hints[Query::HINT_REFRESH_ENTITY]) && isset($this->rootAliases[$dqlAlias])) {
$this->registerManaged($this->ce[$className], $this->_hints[Query::HINT_REFRESH_ENTITY], $data);
}
$refresh = $refreshEntity = null;
if (isset($this->_hints[Query::HINT_REFRESH_ENTITY])) {
$refreshEntity = $this->_hints[Query::HINT_REFRESH_ENTITY];
}
if (isset($this->_hints[Query::HINT_REFRESH])) {
$refresh = $this->_hints[Query::HINT_REFRESH];
}
unset($this->_hints[Query::HINT_REFRESH_ENTITY], $this->_hints[Query::HINT_REFRESH]);
$this->_hints['fetchAlias'] = $dqlAlias;
$entity = $this->_uow->createEntity($className, $data, $this->_hints);
if (isset($refreshEntity)) {
$this->_hints[Query::HINT_REFRESH_ENTITY] = $refreshEntity;
}
if (isset($refresh)) {
$this->_hints[Query::HINT_REFRESH] = $refresh;
}
return $entity;
}
/**
* @param string $className
* @param array $data
@ -440,7 +505,7 @@ class ObjectHydrator extends AbstractHydrator
unset($this->resultPointers[$dqlAlias]);
}
} else {
$element = $this->getEntity($data, $dqlAlias);
$element = $this->getAssociatedEntity($data, $dqlAlias);
if (isset($this->_rsm->indexByMap[$dqlAlias])) {
$indexValue = $row[$this->_rsm->indexByMap[$dqlAlias]];
@ -471,7 +536,7 @@ class ObjectHydrator extends AbstractHydrator
// we only need to take action if this value is null,
// we refresh the entity or its an unitialized proxy.
if (isset($nonemptyComponents[$dqlAlias])) {
$element = $this->getEntity($data, $dqlAlias);
$element = $this->getAssociatedEntity($data, $dqlAlias);
$reflField->setValue($parentObject, $element);
$this->_uow->setOriginalEntityProperty($oid, $relationField, $element);
$targetClass = $this->ce[$relation['targetEntity']];