Skip to content

Commit

Permalink
Merge pull request #1672 from Awkan/fix/order-by-embedded-field
Browse files Browse the repository at this point in the history
 Fix OrderExtension to provide ordering with embedded fields
  • Loading branch information
dunglas committed Feb 1, 2018
2 parents d2ad5b8 + 15ccce6 commit d524064
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 1 deletion.
4 changes: 3 additions & 1 deletion src/Bridge/Doctrine/Orm/Extension/OrderExtension.php
Expand Up @@ -52,7 +52,9 @@ public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGenerator
$field = $order;
$order = 'ASC';
}
if (false === ($pos = strpos($field, '.'))) {

if (false === ($pos = \strpos($field, '.'))
|| isset($classMetaData->embeddedClasses[\substr($field, 0, $pos)])) {
// Configure default filter with property
$field = 'o.'.$field;
} else {
Expand Down
24 changes: 24 additions & 0 deletions tests/Bridge/Doctrine/Orm/Extension/OrderExtensionTest.php
Expand Up @@ -18,6 +18,7 @@
use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface;
use ApiPlatform\Core\Metadata\Resource\ResourceMetadata;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\Dummy;
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\EmbeddedDummy;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\QueryBuilder;
Expand Down Expand Up @@ -134,4 +135,27 @@ public function testApplyToCollectionWithOrderOverridenWithAssociation()
$orderExtensionTest = new OrderExtension('asc', $resourceMetadataFactoryProphecy->reveal());
$orderExtensionTest->applyToCollection($queryBuilder, new QueryNameGenerator(), Dummy::class);
}

public function testApplyToCollectionWithOrderOverriddenWithEmbeddedAssociation()
{
$resourceMetadataFactoryProphecy = $this->prophesize(ResourceMetadataFactoryInterface::class);
$queryBuilderProphecy = $this->prophesize(QueryBuilder::class);

$queryBuilderProphecy->addOrderBy('o.embeddedDummy.dummyName', 'DESC')->shouldBeCalled();

$classMetadataProphecy = $this->prophesize(ClassMetadata::class);
$classMetadataProphecy->getIdentifier()->shouldBeCalled()->willReturn(['id']);
$classMetadataProphecy->embeddedClasses = ['embeddedDummy' => []];

$resourceMetadataFactoryProphecy->create(EmbeddedDummy::class)->shouldBeCalled()->willReturn(new ResourceMetadata(null, null, null, null, null, ['order' => ['embeddedDummy.dummyName' => 'DESC']]));

$emProphecy = $this->prophesize(EntityManager::class);
$emProphecy->getClassMetadata(EmbeddedDummy::class)->shouldBeCalled()->willReturn($classMetadataProphecy->reveal());

$queryBuilderProphecy->getEntityManager()->shouldBeCalled()->willReturn($emProphecy->reveal());

$queryBuilder = $queryBuilderProphecy->reveal();
$orderExtensionTest = new OrderExtension('asc', $resourceMetadataFactoryProphecy->reveal());
$orderExtensionTest->applyToCollection($queryBuilder, new QueryNameGenerator(), EmbeddedDummy::class);
}
}

0 comments on commit d524064

Please sign in to comment.