Nextras\Orm\Mapper\Dbal\RelationshipMapperManyHasMany::fetchCounts PHP Метод

fetchCounts() приватный Метод

private fetchCounts ( Nextras\Dbal\QueryBuilder\QueryBuilder $builder, array $values )
$builder Nextras\Dbal\QueryBuilder\QueryBuilder
$values array
    private function fetchCounts(QueryBuilder $builder, array $values)
    {
        $sourceTable = $builder->getFromAlias();
        $targetTable = QueryBuilderHelper::getAlias($this->joinTable);
        $builder = clone $builder;
        $builder->leftJoin($sourceTable, '%table', $targetTable, '%column = %column', $this->joinTable, "{$targetTable}.{$this->primaryKeyTo}", "{$sourceTable}." . $this->targetRepository->getMapper()->getStorageReflection()->getStoragePrimaryKey()[0]);
        $builder->addSelect('%column', "{$targetTable}.{$this->primaryKeyFrom}");
        $builder->orderBy(null);
        if ($builder->hasLimitOffsetClause()) {
            $sqls = [];
            $args = [];
            foreach ($values as $value) {
                $build = clone $builder;
                $build->andWhere("%column = %any", $this->primaryKeyFrom, $value);
                $sqls[] = "SELECT %any AS %column, COUNT(*) AS [count] FROM (" . $build->getQuerySql() . ') [temp]';
                $args[] = $value;
                $args[] = $this->primaryKeyFrom;
                $args = array_merge($args, $build->getQueryParameters());
            }
            $sql = '(' . implode(') UNION ALL (', $sqls) . ')';
            $result = $this->connection->queryArgs($sql, $args);
        } else {
            $builder->addSelect('COUNT(%column) as count', $this->primaryKeyTo);
            $builder->andWhere('%column IN %any', $this->primaryKeyFrom, $values);
            $builder->groupBy('%column', $this->primaryKeyFrom);
            $result = $this->connection->queryArgs($builder->getQuerySql(), $builder->getQueryParameters());
        }
        $counts = [];
        foreach ($result as $row) {
            $counts[$row->{$this->primaryKeyFrom}] = $row->count;
        }
        return $counts;
    }