private function fetchByTwoPassStrategy(SqlBuilder $builder, array $values) { $builder = clone $builder; $builder->addSelect(":{$this->joinTable}({$this->primaryKeyTo}).{$this->primaryKeyTo}"); $builder->addSelect(":{$this->joinTable}({$this->primaryKeyTo}).{$this->primaryKeyFrom}"); if ($builder->getLimit() || $builder->getLimit() !== 1) { $sqls = $args = []; foreach ($values as $value) { $builderPart = clone $builder; $builderPart->addWhere(":{$this->joinTable}({$this->primaryKeyTo}).{$this->primaryKeyFrom}", $value); $sqls[] = $builderPart->buildSelectQuery(); $args = array_merge($args, $builderPart->getParameters()); } $query = '(' . implode(') UNION ALL (', $sqls) . ')'; $result = $this->context->queryArgs($query, $args); } else { $builder->addWhere(":{$this->joinTable}({$this->primaryKeyTo}).{$this->primaryKeyFrom}", $values); $result = $this->context->queryArgs($builder->buildSelectQuery(), $builder->getParameters()); } $values = []; foreach ($result->fetchAll() as $row) { $values[$row->{$this->primaryKeyTo}] = NULL; } if (count($values) === 0) { return new EntityIterator([]); } $entitiesResult = $this->targetRepository->findById(array_keys($values)); $entitiesResult->getIterator(); $entities = []; foreach ($result->fetchAll() as $row) { $entities[$row->{$this->primaryKeyFrom}][] = $this->targetRepository->getById($row->{$this->primaryKeyTo}); } return new EntityIterator($entities); }