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;
}