ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryChecker::hasOrderByOnToManyJoin PHP Метод

hasOrderByOnToManyJoin() публичный статический метод

Determines whether the query builder has ORDER BY on entity joined through to-many association.
public static hasOrderByOnToManyJoin ( Doctrine\ORM\QueryBuilder $queryBuilder, Doctrine\Common\Persistence\ManagerRegistry $managerRegistry ) : boolean
$queryBuilder Doctrine\ORM\QueryBuilder
$managerRegistry Doctrine\Common\Persistence\ManagerRegistry
Результат boolean
    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;
    }

Usage Example

Пример #1
0
 /**
  * Determines whether output walkers should be used.
  *
  * @param QueryBuilder $queryBuilder
  *
  * @return bool
  */
 private function useOutputWalkers(QueryBuilder $queryBuilder) : bool
 {
     /*
      * "Cannot count query that uses a HAVING clause. Use the output walkers for pagination"
      *
      * @see https://github.com/doctrine/doctrine2/blob/900b55d16afdcdeb5100d435a7166d3a425b9873/lib/Doctrine/ORM/Tools/Pagination/CountWalker.php#L50
      */
     if (QueryChecker::hasHavingClause($queryBuilder)) {
         return true;
     }
     /*
      * "Paginating an entity with foreign key as identifier only works when using the Output Walkers. Call Paginator#setUseOutputWalkers(true) before iterating the paginator."
      *
      * @see https://github.com/doctrine/doctrine2/blob/900b55d16afdcdeb5100d435a7166d3a425b9873/lib/Doctrine/ORM/Tools/Pagination/LimitSubqueryWalker.php#L87
      */
     if (QueryChecker::hasRootEntityWithForeignKeyIdentifier($queryBuilder, $this->managerRegistry)) {
         return true;
     }
     /*
      * "Cannot select distinct identifiers from query with LIMIT and ORDER BY on a column from a fetch joined to-many association. Use output walkers."
      *
      * @see https://github.com/doctrine/doctrine2/blob/900b55d16afdcdeb5100d435a7166d3a425b9873/lib/Doctrine/ORM/Tools/Pagination/LimitSubqueryWalker.php#L149
      */
     if (QueryChecker::hasMaxResults($queryBuilder) && QueryChecker::hasOrderByOnToManyJoin($queryBuilder, $this->managerRegistry)) {
         return true;
     }
     /*
      * When using composite identifiers pagination will need Output walkers
      */
     if (QueryChecker::hasRootEntityWithCompositeIdentifier($queryBuilder, $this->managerRegistry)) {
         return true;
     }
     // Disable output walkers by default (performance)
     return false;
 }
All Usage Examples Of ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryChecker::hasOrderByOnToManyJoin