/** * Resolve DQL alias into class metadata * * @param Doctrine\ORM\Query $query * @param string $alias * @return array | null */ protected function getEntityFromAlias($query, $alias = null) { $em = $query->getEntityManager(); $ast = $query->getAST(); $fromClause = $ast->fromClause; foreach ($fromClause->identificationVariableDeclarations as $root) { $className = $root->rangeVariableDeclaration->abstractSchemaName; $classAlias = $root->rangeVariableDeclaration->aliasIdentificationVariable; if ($classAlias == $alias || null === $alias) { return array('alias' => $classAlias, 'metadata' => $em->getClassMetadata($className)); } else { foreach ($root->joins as $join) { $joinAlias = $join->joinAssociationDeclaration->aliasIdentificationVariable; $joinField = $join->joinAssociationDeclaration->joinAssociationPathExpression->associationField; $joinParent = $join->joinAssociationDeclaration->joinAssociationPathExpression->identificationVariable; if ($joinAlias == $alias) { if ($joinParent != $classAlias) { $data = $this->getEntityFromAlias($query, $joinParent); $metadata = $data['metadata']; } else { $metadata = $em->getClassMetadata($className); } $joinName = $metadata->associationMappings[$joinField]['targetEntity']; return array('alias' => $joinAlias, 'metadata' => $em->getClassMetadata($joinName)); } } } } return null; }