Skip to content

Commit bba7a23

Browse files
committed
Add support for custom types with requireSQLConversion when using ResultSetMappingBuilder::*EntityFromClassMetadata()
1 parent 96bc214 commit bba7a23

File tree

2 files changed

+36
-7
lines changed

2 files changed

+36
-7
lines changed

lib/Doctrine/ORM/Query/ResultSetMappingBuilder.php

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace Doctrine\ORM\Query;
66

7+
use Doctrine\DBAL\Types\Type;
78
use Doctrine\ORM\EntityManagerInterface;
89
use Doctrine\ORM\Internal\SQLResultCasing;
910
use Doctrine\ORM\Mapping\ClassMetadataInfo;
@@ -16,6 +17,7 @@
1617
use function sprintf;
1718
use function strpos;
1819
use function strtolower;
20+
use function var_dump;
1921

2022
/**
2123
* A ResultSetMappingBuilder uses the EntityManager to automatically populate entity fields.
@@ -432,19 +434,26 @@ public function generateSelectClause($tableAliases = [])
432434
foreach ($this->columnOwnerMap as $columnName => $dqlAlias) {
433435
$tableAlias = $tableAliases[$dqlAlias] ?? $dqlAlias;
434436

435-
if ($sql) {
437+
if ($sql !== '') {
436438
$sql .= ', ';
437439
}
438440

439-
$sql .= $tableAlias . '.';
440-
441441
if (isset($this->fieldMappings[$columnName])) {
442-
$class = $this->em->getClassMetadata($this->declaringClasses[$columnName]);
443-
$sql .= $class->fieldMappings[$this->fieldMappings[$columnName]]['columnName'];
442+
$class = $this->em->getClassMetadata($this->declaringClasses[$columnName]);
443+
$fieldName = $this->fieldMappings[$columnName];
444+
$classFieldMapping = $class->fieldMappings[$fieldName];
445+
$columnSql = $tableAlias . '.' . $classFieldMapping['columnName'];
446+
447+
if (isset($classFieldMapping['requireSQLConversion']) && $classFieldMapping['requireSQLConversion'] === true) {
448+
$type = Type::getType($classFieldMapping['type']);
449+
$columnSql = $type->convertToPHPValueSQL($columnSql, $this->em->getConnection()->getDatabasePlatform());
450+
}
451+
452+
$sql .= $columnSql;
444453
} elseif (isset($this->metaMappings[$columnName])) {
445-
$sql .= $this->metaMappings[$columnName];
454+
$sql .= $tableAlias . '.' . $this->metaMappings[$columnName];
446455
} elseif (isset($this->discriminatorColumns[$dqlAlias])) {
447-
$sql .= $this->discriminatorColumns[$dqlAlias];
456+
$sql .= $tableAlias . '.' . $this->discriminatorColumns[$dqlAlias];
448457
}
449458

450459
$sql .= ' AS ' . $columnName;

tests/Doctrine/Tests/ORM/Functional/NativeQueryTest.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@
66

77
use Doctrine\Common\Collections\ArrayCollection;
88
use Doctrine\DBAL\Platforms\AbstractPlatform;
9+
use Doctrine\DBAL\Types\Type as DBALType;
910
use Doctrine\Deprecations\PHPUnit\VerifyDeprecations;
1011
use Doctrine\ORM\Internal\Hydration\HydrationException;
1112
use Doctrine\ORM\Internal\SQLResultCasing;
1213
use Doctrine\ORM\PersistentCollection;
1314
use Doctrine\ORM\Query\Parameter;
1415
use Doctrine\ORM\Query\ResultSetMapping;
1516
use Doctrine\ORM\Query\ResultSetMappingBuilder;
17+
use Doctrine\Tests\DbalTypes\UpperCaseStringType;
1618
use Doctrine\Tests\Models\CMS\CmsAddress;
1719
use Doctrine\Tests\Models\CMS\CmsEmail;
1820
use Doctrine\Tests\Models\CMS\CmsPhonenumber;
@@ -22,6 +24,7 @@
2224
use Doctrine\Tests\Models\Company\CompanyFixContract;
2325
use Doctrine\Tests\Models\Company\CompanyFlexContract;
2426
use Doctrine\Tests\Models\Company\CompanyPerson;
27+
use Doctrine\Tests\Models\CustomType\CustomTypeUpperCase;
2528
use Doctrine\Tests\Models\DDC3899\DDC3899FixContract;
2629
use Doctrine\Tests\Models\DDC3899\DDC3899User;
2730
use Doctrine\Tests\OrmFunctionalTestCase;
@@ -796,4 +799,21 @@ public function testGenerateSelectClauseWithDiscriminatorColumn(): void
796799

797800
$this->assertSQLEquals('u1.id as id, c1.discr as discr', $selectClause);
798801
}
802+
803+
public function testGenerateSelectClauseWithCustomType(): void
804+
{
805+
if (DBALType::hasType('upper_case_string')) {
806+
DBALType::overrideType('upper_case_string', UpperCaseStringType::class);
807+
} else {
808+
DBALType::addType('upper_case_string', UpperCaseStringType::class);
809+
}
810+
811+
$rsm = new ResultSetMappingBuilder($this->_em, ResultSetMappingBuilder::COLUMN_RENAMING_INCREMENT);
812+
813+
$rsm->addRootEntityFromClassMetadata(CustomTypeUpperCase::class, 'ct');
814+
815+
$selectClause = $rsm->generateSelectClause(['ct' => 'ct1']);
816+
817+
$this->assertSQLEquals('u1.id as id, c1.discr as discr', $selectClause);
818+
}
799819
}

0 commit comments

Comments
 (0)