/**
  * {@inheritdoc}
  */
 protected function hydrateRowData(array $sqlResult, array &$result)
 {
     $entityName = $this->class->name;
     $data = [];
     // We need to find the correct entity class name if we have inheritance in resultset
     if ($this->class->inheritanceType !== ClassMetadata::INHERITANCE_TYPE_NONE) {
         $discrColumnName = $this->_platform->getSQLResultCasing($this->class->discriminatorColumn['name']);
         // Find mapped discriminator column from the result set.
         if ($metaMappingDiscrColumnName = array_search($discrColumnName, $this->_rsm->metaMappings)) {
             $discrColumnName = $metaMappingDiscrColumnName;
         }
         if (!isset($sqlResult[$discrColumnName])) {
             throw HydrationException::missingDiscriminatorColumn($entityName, $discrColumnName, key($this->_rsm->aliasMap));
         }
         if ($sqlResult[$discrColumnName] === '') {
             throw HydrationException::emptyDiscriminatorValue(key($this->_rsm->aliasMap));
         }
         $discrMap = $this->class->discriminatorMap;
         if (!isset($discrMap[$sqlResult[$discrColumnName]])) {
             throw HydrationException::invalidDiscriminatorValue($sqlResult[$discrColumnName], array_keys($discrMap));
         }
         $entityName = $discrMap[$sqlResult[$discrColumnName]];
         unset($sqlResult[$discrColumnName]);
     }
     foreach ($sqlResult as $column => $value) {
         // An ObjectHydrator should be used instead of SimpleObjectHydrator
         if (isset($this->_rsm->relationMap[$column])) {
             throw new \Exception(sprintf('Unable to retrieve association information for column "%s"', $column));
         }
         $cacheKeyInfo = $this->hydrateColumnInfo($column);
         if (!$cacheKeyInfo) {
             continue;
         }
         // Check if value is null before conversion (because some types convert null to something else)
         $valueIsNull = null === $value;
         // Convert field to a valid PHP value
         if (isset($cacheKeyInfo['type'])) {
             $type = $cacheKeyInfo['type'];
             $value = $type->convertToPHPValue($value, $this->_platform);
         }
         $fieldName = $cacheKeyInfo['fieldName'];
         // Prevent overwrite in case of inherit classes using same property name (See AbstractHydrator)
         if (!isset($data[$fieldName]) || !$valueIsNull) {
             $data[$fieldName] = $value;
         }
     }
     if (isset($this->_hints[Query::HINT_REFRESH_ENTITY])) {
         $this->registerManaged($this->class, $this->_hints[Query::HINT_REFRESH_ENTITY], $data);
     }
     $uow = $this->_em->getUnitOfWork();
     $entity = $uow->createEntity($entityName, $data, $this->_hints);
     $result[] = $entity;
     if (isset($this->_hints[Query::HINT_INTERNAL_ITERATION]) && $this->_hints[Query::HINT_INTERNAL_ITERATION]) {
         $this->_uow->hydrationComplete();
     }
 }
示例#2
0
 /**
  * {@inheritdoc}
  */
 protected function hydrateRowData(array $sqlResult, array &$cache, array &$result)
 {
     $entityName = $this->class->name;
     $data = array();
     // We need to find the correct entity class name if we have inheritance in resultset
     if ($this->class->inheritanceType !== ClassMetadata::INHERITANCE_TYPE_NONE) {
         $discrColumnName = $this->_platform->getSQLResultCasing($this->class->discriminatorColumn['name']);
         if (!isset($sqlResult[$discrColumnName])) {
             throw HydrationException::missingDiscriminatorColumn($entityName, $discrColumnName, key($this->_rsm->aliasMap));
         }
         if ($sqlResult[$discrColumnName] === '') {
             throw HydrationException::emptyDiscriminatorValue(key($this->_rsm->aliasMap));
         }
         $discrMap = $this->class->discriminatorMap;
         if (!isset($discrMap[$sqlResult[$discrColumnName]])) {
             throw HydrationException::invalidDiscriminatorValue($sqlResult[$discrColumnName], array_keys($discrMap));
         }
         $entityName = $discrMap[$sqlResult[$discrColumnName]];
         unset($sqlResult[$discrColumnName]);
     }
     foreach ($sqlResult as $column => $value) {
         // Hydrate column information if not yet present
         if (!isset($cache[$column])) {
             if (($info = $this->hydrateColumnInfo($entityName, $column)) === null) {
                 continue;
             }
             $cache[$column] = $info;
         }
         // Convert field to a valid PHP value
         if (isset($cache[$column]['type'])) {
             $value = Type::getType($cache[$column]['type'])->convertToPHPValue($value, $this->_platform);
         }
         // Prevent overwrite in case of inherit classes using same property name (See AbstractHydrator)
         if (isset($cache[$column]) && (!isset($data[$cache[$column]['name']]) || $value !== null)) {
             $data[$cache[$column]['name']] = $value;
         }
     }
     if (isset($this->_hints[Query::HINT_REFRESH_ENTITY])) {
         $this->registerManaged($this->class, $this->_hints[Query::HINT_REFRESH_ENTITY], $data);
     }
     $uow = $this->_em->getUnitOfWork();
     $entity = $uow->createEntity($entityName, $data, $this->_hints);
     $result[] = $entity;
 }
 /**
  * Gets an entity instance.
  *
  * @param array  $data     The instance data.
  * @param string $dqlAlias The DQL alias of the entity's class.
  *
  * @return object The entity.
  *
  * @throws HydrationException
  */
 private function getEntity(array $data, $dqlAlias)
 {
     $className = $this->_rsm->aliasMap[$dqlAlias];
     if (isset($this->_rsm->discriminatorColumns[$dqlAlias])) {
         $fieldName = $this->_rsm->discriminatorColumns[$dqlAlias];
         if (!isset($this->_rsm->metaMappings[$fieldName])) {
             throw HydrationException::missingDiscriminatorMetaMappingColumn($className, $fieldName, $dqlAlias);
         }
         $discrColumn = $this->_rsm->metaMappings[$fieldName];
         if (!isset($data[$discrColumn])) {
             throw HydrationException::missingDiscriminatorColumn($className, $discrColumn, $dqlAlias);
         }
         if ($data[$discrColumn] === "") {
             throw HydrationException::emptyDiscriminatorValue($dqlAlias);
         }
         $discrMap = $this->_metadataCache[$className]->discriminatorMap;
         if (!isset($discrMap[$data[$discrColumn]])) {
             throw HydrationException::invalidDiscriminatorValue($data[$discrColumn], array_keys($discrMap));
         }
         $className = $discrMap[$data[$discrColumn]];
         unset($data[$discrColumn]);
     }
     if (isset($this->_hints[Query::HINT_REFRESH_ENTITY]) && isset($this->rootAliases[$dqlAlias])) {
         $this->registerManaged($this->_metadataCache[$className], $this->_hints[Query::HINT_REFRESH_ENTITY], $data);
     }
     $this->_hints['fetchAlias'] = $dqlAlias;
     return $this->_uow->createEntity($className, $data, $this->_hints);
 }