From a0c4597de0c10e11f92ba1b842a961b2c5c7d82c Mon Sep 17 00:00:00 2001 From: Matthieu Date: Wed, 13 May 2026 10:49:43 +0200 Subject: [PATCH] fix(fournisseurs) : ConstructeurSearchFilter utilise EXISTS subquery au lieu de LEFT JOIN MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le LEFT JOIN sur telephones causait une erreur PostgreSQL 'column must appear in GROUP BY' parce que Doctrine sélectionnait aussi les colonnes des téléphones joints. EXISTS subquery corrélée évite la duplication de lignes sans introduire de GROUP BY. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/Filter/ConstructeurSearchFilter.php | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/Filter/ConstructeurSearchFilter.php b/src/Filter/ConstructeurSearchFilter.php index 0fb8fa4..07ad956 100644 --- a/src/Filter/ConstructeurSearchFilter.php +++ b/src/Filter/ConstructeurSearchFilter.php @@ -7,6 +7,7 @@ namespace App\Filter; use ApiPlatform\Doctrine\Orm\Filter\AbstractFilter; use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface; use ApiPlatform\Metadata\Operation; +use App\Entity\ConstructeurTelephone; use Doctrine\ORM\QueryBuilder; /** @@ -38,22 +39,27 @@ final class ConstructeurSearchFilter extends AbstractFilter } $alias = $queryBuilder->getRootAliases()[0]; - $telAlias = $queryNameGenerator->generateJoinAlias('telephones'); + $telAlias = $queryNameGenerator->generateJoinAlias('phoneSearch'); $paramName = $queryNameGenerator->generateParameterName('search'); $likePattern = '%'.mb_strtolower(trim($value)).'%'; + $em = $queryBuilder->getEntityManager(); + $phoneSubQuery = $em->createQueryBuilder() + ->select('1') + ->from(ConstructeurTelephone::class, $telAlias) + ->where(sprintf('%1$s.constructeur = %2$s', $telAlias, $alias)) + ->andWhere(sprintf('LOWER(%s.numero) LIKE :%s', $telAlias, $paramName)) + ->getDQL() + ; + $queryBuilder - ->leftJoin(sprintf('%s.telephones', $alias), $telAlias) ->andWhere(sprintf( - 'LOWER(%1$s.name) LIKE :%4$s OR LOWER(%1$s.email) LIKE :%4$s OR LOWER(%2$s.numero) LIKE :%4$s', + 'LOWER(%1$s.name) LIKE :%2$s OR LOWER(%1$s.email) LIKE :%2$s OR EXISTS (%3$s)', $alias, - $telAlias, - '', $paramName, + $phoneSubQuery, )) ->setParameter($paramName, $likePattern) ; - - $queryBuilder->groupBy(sprintf('%s.id', $alias)); } }