/RestAPI/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php
PHP | 152 lines | 84 code | 31 blank | 37 comment | 16 complexity | 8d9f220889dde747aa0a6088b53f9e5d MD5 | raw file
- <?php
- /*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
- namespace Doctrine\ORM\Internal\Hydration;
- use PDO;
- use Doctrine\DBAL\Types\Type;
- use Doctrine\ORM\Mapping\ClassMetadata;
- use Doctrine\ORM\Query;
- class SimpleObjectHydrator extends AbstractHydrator
- {
- /**
- * @var ClassMetadata
- */
- private $class;
- /**
- * {@inheritdoc}
- */
- protected function prepare()
- {
- if (count($this->_rsm->aliasMap) !== 1) {
- throw new \RuntimeException("Cannot use SimpleObjectHydrator with a ResultSetMapping that contains more than one object result.");
- }
- if ($this->_rsm->scalarMappings) {
- throw new \RuntimeException("Cannot use SimpleObjectHydrator with a ResultSetMapping that contains scalar mappings.");
- }
- $this->class = $this->getClassMetadata(reset($this->_rsm->aliasMap));
- }
- /**
- * {@inheritdoc}
- */
- protected function cleanup()
- {
- parent::cleanup();
- $this->_uow->triggerEagerLoads();
- $this->_uow->hydrationComplete();
- }
- /**
- * {@inheritdoc}
- */
- protected function hydrateAllData()
- {
- $result = array();
- while ($row = $this->_stmt->fetch(PDO::FETCH_ASSOC)) {
- $this->hydrateRowData($row, $result);
- }
- $this->_em->getUnitOfWork()->triggerEagerLoads();
- return $result;
- }
- /**
- * {@inheritdoc}
- */
- protected function hydrateRowData(array $sqlResult, 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']);
- // 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;
- }
- // 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]) || $value !== null) {
- $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();
- }
- }
- }