ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\EagerLoadingExtension::applyToCollection PHP Method

applyToCollection() public method

public applyToCollection ( Doctrine\ORM\QueryBuilder $queryBuilder, ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null )
$queryBuilder Doctrine\ORM\QueryBuilder
$queryNameGenerator ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface
$resourceClass string
$operationName string
    public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null)
    {
        $options = [];
        if (null !== $operationName) {
            $options = ['collection_operation_name' => $operationName];
        }
        $forceEager = $this->isForceEager($resourceClass, $options);
        try {
            $groups = $this->getSerializerGroups($resourceClass, $options, 'normalization_context');
            $this->joinRelations($queryBuilder, $queryNameGenerator, $resourceClass, $forceEager, $queryBuilder->getRootAliases()[0], $groups);
        } catch (ResourceClassNotFoundException $resourceClassNotFoundException) {
            //ignore the not found exception
        }
    }

Usage Example

 /**
  * @expectedException \ApiPlatform\Core\Exception\RuntimeException
  * @expectedExceptionMessage The total number of joined relations has exceeded the specified maximum. Raise the limit if necessary.
  */
 public function testMaxDepthReached()
 {
     $resourceMetadataFactoryProphecy = $this->prophesize(ResourceMetadataFactoryInterface::class);
     $resourceMetadataFactoryProphecy->create(Dummy::class)->willReturn(new ResourceMetadata());
     $propertyNameCollectionFactoryProphecy = $this->prophesize(PropertyNameCollectionFactoryInterface::class);
     $relatedNameCollection = new PropertyNameCollection(['dummy']);
     $dummyNameCollection = new PropertyNameCollection(['relatedDummy']);
     $propertyNameCollectionFactoryProphecy->create(RelatedDummy::class)->willReturn($relatedNameCollection)->shouldBeCalled();
     $propertyNameCollectionFactoryProphecy->create(Dummy::class)->willReturn($dummyNameCollection)->shouldBeCalled();
     $propertyMetadataFactoryProphecy = $this->prophesize(PropertyMetadataFactoryInterface::class);
     $relationPropertyMetadata = new PropertyMetadata();
     $relationPropertyMetadata = $relationPropertyMetadata->withReadableLink(true);
     $propertyMetadataFactoryProphecy->create(Dummy::class, 'relatedDummy', [])->willReturn($relationPropertyMetadata)->shouldBeCalled();
     $relatedPropertyMetadata = new PropertyMetadata();
     $relatedPropertyMetadata = $relatedPropertyMetadata->withReadableLink(true);
     $propertyMetadataFactoryProphecy->create(RelatedDummy::class, 'dummy', [])->willReturn($relatedPropertyMetadata)->shouldBeCalled();
     $classMetadataProphecy = $this->prophesize(ClassMetadata::class);
     $classMetadataProphecy->associationMappings = ['relatedDummy' => ['fetch' => 3, 'joinColumns' => [['nullable' => false]], 'targetEntity' => RelatedDummy::class]];
     $relatedClassMetadataProphecy = $this->prophesize(ClassMetadata::class);
     $relatedClassMetadataProphecy->associationMappings = ['dummy' => ['fetch' => 3, 'joinColumns' => [['nullable' => false]], 'targetEntity' => Dummy::class]];
     $emProphecy = $this->prophesize(EntityManager::class);
     $emProphecy->getClassMetadata(Dummy::class)->shouldBeCalled()->willReturn($classMetadataProphecy->reveal());
     $emProphecy->getClassMetadata(RelatedDummy::class)->shouldBeCalled()->willReturn($relatedClassMetadataProphecy->reveal());
     $queryBuilderProphecy = $this->prophesize(QueryBuilder::class);
     $queryBuilderProphecy->getRootAliases()->willReturn(['o']);
     $queryBuilderProphecy->getEntityManager()->willReturn($emProphecy);
     $queryBuilderProphecy->innerJoin(Argument::type('string'), Argument::type('string'))->shouldBeCalled();
     $queryBuilderProphecy->addSelect(Argument::type('string'))->shouldBeCalled();
     $eagerExtensionTest = new EagerLoadingExtension($propertyNameCollectionFactoryProphecy->reveal(), $propertyMetadataFactoryProphecy->reveal(), $resourceMetadataFactoryProphecy->reveal(), 30, false);
     $eagerExtensionTest->applyToCollection($queryBuilderProphecy->reveal(), new QueryNameGenerator(), Dummy::class);
 }