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 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()); }
/** * Determines whether the query builder has ORDER BY on entity joined through * to-many association. * * @param QueryBuilder $queryBuilder * @param ManagerRegistry $managerRegistry * * @return bool */ public static function hasOrderByOnToManyJoin(QueryBuilder $queryBuilder, ManagerRegistry $managerRegistry) : bool { if (empty($orderByParts = $queryBuilder->getDQLPart('orderBy')) || empty($joinParts = $queryBuilder->getDQLPart('join'))) { return false; } $orderByAliases = []; foreach ($orderByParts as $orderBy) { $parts = QueryJoinParser::getOrderByParts($orderBy); foreach ($parts as $part) { if (false !== ($pos = strpos($part, '.'))) { $alias = substr($part, 0, $pos); $orderByAliases[$alias] = true; } } } if (!empty($orderByAliases)) { foreach ($joinParts as $joins) { foreach ($joins as $join) { $alias = QueryJoinParser::getJoinAlias($join); if (isset($orderByAliases[$alias])) { $relationship = QueryJoinParser::getJoinRelationship($join); list($parentAlias, $association) = explode('.', $relationship); $parentMetadata = QueryJoinParser::getClassMetadataFromJoinAlias($parentAlias, $queryBuilder, $managerRegistry); if ($parentMetadata->isCollectionValuedAssociation($association)) { return true; } } } } } return false; }