From f55efc324827d0a794090668b953d223a8a0784a Mon Sep 17 00:00:00 2001 From: Andreas Allacher Date: Sun, 24 Oct 2021 11:03:53 +0200 Subject: [PATCH] UniqueEntityValidator: Retrieve at max two entities for unique entity check. Fixes: #43254 --- src/Symfony/Bridge/Doctrine/CHANGELOG.md | 1 + .../Validator/Constraints/UniqueEntityValidator.php | 13 ++++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Bridge/Doctrine/CHANGELOG.md b/src/Symfony/Bridge/Doctrine/CHANGELOG.md index 37b39cf8d980e..d2e0a7761eeef 100644 --- a/src/Symfony/Bridge/Doctrine/CHANGELOG.md +++ b/src/Symfony/Bridge/Doctrine/CHANGELOG.md @@ -6,6 +6,7 @@ CHANGELOG * Add `DoctrineOpenTransactionLoggerMiddleware` to log when a transaction has been left open * Deprecate `PdoCacheAdapterDoctrineSchemaSubscriber` and add `DoctrineDbalCacheAdapterSchemaSubscriber` instead + * `UniqueEntity` constraint retrieves a maximum of two entities if the default repository method is used. 5.3 --- diff --git a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php index 4996848143b73..c1caadd9df3dd 100644 --- a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php +++ b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php @@ -134,7 +134,18 @@ public function validate($entity, Constraint $constraint) $repository = $em->getRepository(\get_class($entity)); } - $result = $repository->{$constraint->repositoryMethod}($criteria); + $arguments = [$criteria]; + + /* If the default repository method is used, it is always enough to retrieve at most two entities because: + * - No entity returned, the current entity is definitely unique. + * - More than one entity returned, the current entity cannot be unique. + * - One entity returned the uniqueness depends on the current entity. + */ + if ('findBy' === $constraint->repositoryMethod) { + $arguments = [$criteria, null, 2]; + } + + $result = $repository->{$constraint->repositoryMethod}(...$arguments); if ($result instanceof \IteratorAggregate) { $result = $result->getIterator();