Skip to content

Commit c73cc65

Browse files
pmattmanncarlobeltrame
authored andcommitted
fix: prevent adding same alias twice; doctrine does not like it
1 parent ff4f0bf commit c73cc65

File tree

1 file changed

+14
-2
lines changed

1 file changed

+14
-2
lines changed

src/Core/Bridge/Doctrine/Orm/Extension/EagerLoadingExtension.php

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
use Doctrine\ORM\Mapping\ClassMetadata;
3232
use Doctrine\ORM\Mapping\ClassMetadataInfo;
3333
use Doctrine\ORM\Query\Expr\Join;
34+
use Doctrine\ORM\Query\Expr\Select;
3435
use Doctrine\ORM\QueryBuilder;
3536
use Symfony\Component\HttpFoundation\RequestStack;
3637
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface;
@@ -264,7 +265,7 @@ private function joinRelations(QueryBuilder $queryBuilder, QueryNameGeneratorInt
264265
continue;
265266
}
266267
} else {
267-
$queryBuilder->addSelect($associationAlias);
268+
$this->addSelectOnce($queryBuilder, $associationAlias);
268269
}
269270

270271
// Avoid recursive joins for self-referencing relations
@@ -296,7 +297,7 @@ private function addSelect(QueryBuilder $queryBuilder, string $entity, string $a
296297
$entityManager = $queryBuilder->getEntityManager();
297298
$targetClassMetadata = $entityManager->getClassMetadata($entity);
298299
if (!empty($targetClassMetadata->subClasses)) {
299-
$queryBuilder->addSelect($associationAlias);
300+
$this->addSelectOnce($queryBuilder, $associationAlias);
300301

301302
return;
302303
}
@@ -335,6 +336,17 @@ private function addSelect(QueryBuilder $queryBuilder, string $entity, string $a
335336
$queryBuilder->addSelect(sprintf('partial %s.{%s}', $associationAlias, implode(',', $select)));
336337
}
337338

339+
private function addSelectOnce($queryBuilder, $alias)
340+
{
341+
$existingSelects = array_reduce($queryBuilder->getDQLPart('select') ?? [], function ($existing, $dqlSelect) {
342+
return ($dqlSelect instanceof Select) ? array_merge($existing, $dqlSelect->getParts()) : $existing;
343+
}, []);
344+
345+
if (!\in_array($alias, $existingSelects, true)) {
346+
$queryBuilder->addSelect($alias);
347+
}
348+
}
349+
338350
/**
339351
* Gets the serializer context.
340352
*

0 commit comments

Comments
 (0)