ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryJoinParser::getClassMetadataFromJoinAlias PHP Method

getClassMetadataFromJoinAlias() public static method

Gets the class metadata from a given join alias.
public static getClassMetadataFromJoinAlias ( string $alias, Doctrine\ORM\QueryBuilder $queryBuilder, Doctrine\Common\Persistence\ManagerRegistry $managerRegistry ) : Doctrine\ORM\Mapping\ClassMetadata
$alias string
$queryBuilder Doctrine\ORM\QueryBuilder
$managerRegistry Doctrine\Common\Persistence\ManagerRegistry
return Doctrine\ORM\Mapping\ClassMetadata
    public static function getClassMetadataFromJoinAlias(string $alias, QueryBuilder $queryBuilder, ManagerRegistry $managerRegistry) : ClassMetadata
    {
        $rootEntities = $queryBuilder->getRootEntities();
        $rootAliases = $queryBuilder->getRootAliases();
        $joinParts = $queryBuilder->getDQLPart('join');
        $aliasMap = [];
        $targetAlias = $alias;
        foreach ($joinParts as $rootAlias => $joins) {
            $aliasMap[$rootAlias] = 'root';
            foreach ($joins as $join) {
                $alias = self::getJoinAlias($join);
                $relationship = self::getJoinRelationship($join);
                $pos = strpos($relationship, '.');
                $aliasMap[$alias] = ['parentAlias' => substr($relationship, 0, $pos), 'association' => substr($relationship, $pos + 1)];
            }
        }
        $associationStack = [];
        $rootAlias = null;
        while (null === $rootAlias) {
            $mapping = $aliasMap[$targetAlias];
            if ('root' === $mapping) {
                $rootAlias = $targetAlias;
            } else {
                $associationStack[] = $mapping['association'];
                $targetAlias = $mapping['parentAlias'];
            }
        }
        $rootEntity = $rootEntities[array_search($rootAlias, $rootAliases)];
        $rootMetadata = $managerRegistry->getManagerForClass($rootEntity)->getClassMetadata($rootEntity);
        $metadata = $rootMetadata;
        while (null !== ($association = array_pop($associationStack))) {
            $associationClass = $metadata->getAssociationTargetClass($association);
            $metadata = $managerRegistry->getManagerForClass($associationClass)->getClassMetadata($associationClass);
        }
        return $metadata;
    }

Usage Example

 public function testGetClassMetadataFromJoinAlias()
 {
     $queryBuilder = $this->prophesize(QueryBuilder::class);
     $queryBuilder->getRootEntities()->willReturn(['Dummy']);
     $queryBuilder->getRootAliases()->willReturn(['d']);
     $queryBuilder->getDQLPart('join')->willReturn(['a_1' => new Join('INNER_JOIN', 'relatedDummy', 'a_1', null, 'a_1.name = r.name')]);
     $classMetadata = $this->prophesize(ClassMetadata::class);
     $objectManager = $this->prophesize(ObjectManager::class);
     $objectManager->getClassMetadata('Dummy')->willReturn($classMetadata->reveal());
     $managerRegistry = $this->prophesize(ManagerRegistry::class);
     $managerRegistry->getManagerForClass('Dummy')->willReturn($objectManager->reveal());
     $metadata = QueryJoinParser::getClassMetadataFromJoinAlias('a_1', $queryBuilder->reveal(), $managerRegistry->reveal());
     $this->assertEquals($metadata, $classMetadata->reveal());
 }
All Usage Examples Of ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryJoinParser::getClassMetadataFromJoinAlias