Skip to content

Commit faf24ab

Browse files
author
abluchet
committed
Allow to fetchEager a non-serializable property fix #1290
The following will bypass `readable` and `readableLink`: ``` @ApiProperty(attributes={"fetchEager": true}) ```
1 parent 4976011 commit faf24ab

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ private function joinRelations(QueryBuilder $queryBuilder, QueryNameGeneratorInt
156156
continue;
157157
}
158158

159-
if (false === $propertyMetadata->isReadableLink() || false === $propertyMetadata->isReadable()) {
159+
if ((false === $propertyMetadata->isReadableLink() || false === $propertyMetadata->isReadable()) && false === $propertyMetadata->getAttribute('fetchEager', false)) {
160160
continue;
161161
}
162162

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

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -665,4 +665,49 @@ public function testApplyToCollectionNoPartial()
665665
$eagerExtensionTest = new EagerLoadingExtension($propertyNameCollectionFactoryProphecy->reveal(), $propertyMetadataFactoryProphecy->reveal(), $resourceMetadataFactoryProphecy->reveal(), 30);
666666
$eagerExtensionTest->applyToCollection($queryBuilder, new QueryNameGenerator(), Dummy::class);
667667
}
668+
669+
public function testApplyToCollectionWithANonRedableButFetchEagerProperty()
670+
{
671+
$resourceMetadataFactoryProphecy = $this->prophesize(ResourceMetadataFactoryInterface::class);
672+
$resourceMetadataFactoryProphecy->create(Dummy::class)->willReturn(new ResourceMetadata());
673+
674+
$propertyNameCollectionFactoryProphecy = $this->prophesize(PropertyNameCollectionFactoryInterface::class);
675+
676+
$relatedNameCollection = new PropertyNameCollection(['id', 'name', 'notindatabase', 'notreadable']);
677+
678+
$propertyMetadataFactoryProphecy = $this->prophesize(PropertyMetadataFactoryInterface::class);
679+
$relationPropertyMetadata = new PropertyMetadata();
680+
$relationPropertyMetadata = $relationPropertyMetadata->withAttributes(['fetchEager' => true]);
681+
$relationPropertyMetadata = $relationPropertyMetadata->withReadableLink(false);
682+
$relationPropertyMetadata = $relationPropertyMetadata->withReadable(false);
683+
684+
$propertyMetadataFactoryProphecy->create(Dummy::class, 'relatedDummy', [])->willReturn($relationPropertyMetadata)->shouldBeCalled();
685+
$propertyMetadataFactoryProphecy->create(Dummy::class, 'relatedDummy2', [])->willReturn($relationPropertyMetadata)->shouldBeCalled();
686+
687+
$queryBuilderProphecy = $this->prophesize(QueryBuilder::class);
688+
689+
$classMetadataProphecy = $this->prophesize(ClassMetadata::class);
690+
$classMetadataProphecy->associationMappings = [
691+
'relatedDummy' => ['fetch' => 3, 'joinColumns' => [['nullable' => true]], 'targetEntity' => RelatedDummy::class],
692+
'relatedDummy2' => ['fetch' => 3, 'joinColumns' => [['nullable' => false]], 'targetEntity' => RelatedDummy::class],
693+
];
694+
695+
$emProphecy = $this->prophesize(EntityManager::class);
696+
$relatedClassMetadataProphecy = $this->prophesize(ClassMetadata::class);
697+
$relatedClassMetadataProphecy->associationMappings = [];
698+
$emProphecy->getClassMetadata(Dummy::class)->shouldBeCalled()->willReturn($classMetadataProphecy->reveal());
699+
$emProphecy->getClassMetadata(RelatedDummy::class)->shouldBeCalled()->willReturn($relatedClassMetadataProphecy->reveal());
700+
701+
$queryBuilderProphecy->getRootAliases()->willReturn(['o']);
702+
$queryBuilderProphecy->getEntityManager()->willReturn($emProphecy);
703+
704+
$queryBuilderProphecy->leftJoin('o.relatedDummy', 'relatedDummy_a1')->shouldBeCalled(1);
705+
$queryBuilderProphecy->innerJoin('o.relatedDummy2', 'relatedDummy2_a2')->shouldBeCalled(1);
706+
$queryBuilderProphecy->addSelect('relatedDummy_a1')->shouldBeCalled(1);
707+
$queryBuilderProphecy->addSelect('relatedDummy2_a2')->shouldBeCalled(1);
708+
709+
$queryBuilder = $queryBuilderProphecy->reveal();
710+
$eagerExtensionTest = new EagerLoadingExtension($propertyNameCollectionFactoryProphecy->reveal(), $propertyMetadataFactoryProphecy->reveal(), $resourceMetadataFactoryProphecy->reveal(), 30);
711+
$eagerExtensionTest->applyToCollection($queryBuilder, new QueryNameGenerator(), Dummy::class);
712+
}
668713
}

0 commit comments

Comments
 (0)