Skip to content

Commit d524064

Browse files
authored
Merge pull request #1672 from Awkan/fix/order-by-embedded-field
Fix OrderExtension to provide ordering with embedded fields
2 parents d2ad5b8 + 15ccce6 commit d524064

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

src/Bridge/Doctrine/Orm/Extension/OrderExtension.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGenerator
5252
$field = $order;
5353
$order = 'ASC';
5454
}
55-
if (false === ($pos = strpos($field, '.'))) {
55+
56+
if (false === ($pos = \strpos($field, '.'))
57+
|| isset($classMetaData->embeddedClasses[\substr($field, 0, $pos)])) {
5658
// Configure default filter with property
5759
$field = 'o.'.$field;
5860
} else {

tests/Bridge/Doctrine/Orm/Extension/OrderExtensionTest.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface;
1919
use ApiPlatform\Core\Metadata\Resource\ResourceMetadata;
2020
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\Dummy;
21+
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\EmbeddedDummy;
2122
use Doctrine\ORM\EntityManager;
2223
use Doctrine\ORM\Mapping\ClassMetadata;
2324
use Doctrine\ORM\QueryBuilder;
@@ -134,4 +135,27 @@ public function testApplyToCollectionWithOrderOverridenWithAssociation()
134135
$orderExtensionTest = new OrderExtension('asc', $resourceMetadataFactoryProphecy->reveal());
135136
$orderExtensionTest->applyToCollection($queryBuilder, new QueryNameGenerator(), Dummy::class);
136137
}
138+
139+
public function testApplyToCollectionWithOrderOverriddenWithEmbeddedAssociation()
140+
{
141+
$resourceMetadataFactoryProphecy = $this->prophesize(ResourceMetadataFactoryInterface::class);
142+
$queryBuilderProphecy = $this->prophesize(QueryBuilder::class);
143+
144+
$queryBuilderProphecy->addOrderBy('o.embeddedDummy.dummyName', 'DESC')->shouldBeCalled();
145+
146+
$classMetadataProphecy = $this->prophesize(ClassMetadata::class);
147+
$classMetadataProphecy->getIdentifier()->shouldBeCalled()->willReturn(['id']);
148+
$classMetadataProphecy->embeddedClasses = ['embeddedDummy' => []];
149+
150+
$resourceMetadataFactoryProphecy->create(EmbeddedDummy::class)->shouldBeCalled()->willReturn(new ResourceMetadata(null, null, null, null, null, ['order' => ['embeddedDummy.dummyName' => 'DESC']]));
151+
152+
$emProphecy = $this->prophesize(EntityManager::class);
153+
$emProphecy->getClassMetadata(EmbeddedDummy::class)->shouldBeCalled()->willReturn($classMetadataProphecy->reveal());
154+
155+
$queryBuilderProphecy->getEntityManager()->shouldBeCalled()->willReturn($emProphecy->reveal());
156+
157+
$queryBuilder = $queryBuilderProphecy->reveal();
158+
$orderExtensionTest = new OrderExtension('asc', $resourceMetadataFactoryProphecy->reveal());
159+
$orderExtensionTest->applyToCollection($queryBuilder, new QueryNameGenerator(), EmbeddedDummy::class);
160+
}
137161
}

0 commit comments

Comments
 (0)