public function readQueryResult($class) { $reflClass = new \ReflectionClass($class); $classAnnotations = $this->reader->getClassAnnotations($reflClass); $isQueryResult = false; foreach ($classAnnotations as $classAnnotation) { if ($classAnnotation instanceof QueryResult) { $isQueryResult = true; } } if (!$isQueryResult) { throw new \RuntimeException(sprintf('The class "%s" is not a valid QueryResult entity', $class)); } $queryResultMapper = new QueryResultMapper($class); foreach ($reflClass->getProperties() as $property) { foreach ($this->reader->getPropertyAnnotations($property) as $propertyAnnotation) { if ($propertyAnnotation instanceof MappedResult) { $queryResultMapper->addField(new ResultField($property->getName(), $propertyAnnotation->type, $propertyAnnotation->target)); } } } return $queryResultMapper; }
private function hydrateQueryRecord(QueryResultMapper $resultMapper, Record $record) { $reflClass = new \ReflectionClass($resultMapper->getClassName()); $instance = $reflClass->newInstanceWithoutConstructor(); foreach ($resultMapper->getFields() as $field) { if (!$record->hasValue($field->getFieldName())) { throw new \RuntimeException(sprintf('The record doesn\'t contain the required field "%s"', $field->getFieldName())); } $value = null; if ($field->isEntity()) { $value = $this->hydrate($record, false, $field->getFieldName(), ClassUtils::getFullClassName($field->getTarget(), $resultMapper->getClassName())); } else { $value = $record->get($field->getFieldName()); } $property = $reflClass->getProperty($field->getFieldName()); $property->setAccessible(true); $property->setValue($instance, $value); } return $instance; }