Исключение NonUniqueResultException
Исключение NonUniqueResultException выбрасывается компонентом Doctrine ORM, который используется в Symfony для работы с базой данных. Оно сигнализирует о том, что метод getSingleResult или getOneOrNullResult был вызван для запроса, вернувшего более одной строки. Это исключение наследуется от класса Doctrine\ORM\NonUniqueResultException и не содержит параметров в конструкторе.
Синтаксис
use Doctrine\ORM\NonUniqueResultException;
throw new NonUniqueResultException();
Пример
Давайте рассмотрим ситуацию, когда запрос возвращает несколько записей, а мы пытаемся получить одну. Сначала создадим сущность Article:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
class Article
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
private int $id;
#[ORM\Column(type: 'string')]
private string $title;
public function getId(): int
{
return $this->id;
}
public function getTitle(): string
{
return $this->title;
}
public function setTitle(string $title): void
{
$this->title = $title;
}
}
?>
Теперь создадим контроллер, который выполняет запрос и пытается получить единственный результат:
<?php
namespace App\Controller;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\NonUniqueResultException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(EntityManagerInterface $em): Response
{
$query = $em->createQuery('SELECT a FROM App\Entity\Article a');
try {
$res = $query->getSingleResult();
return new Response($res->getTitle());
} catch (NonUniqueResultException $e) {
return new Response('Multiple articles found: ' . $e->getMessage());
}
}
}
?>
Если в базе данных находится более одной статьи, выполнение кода вернёт следующий результат:
Multiple articles found: Query returned more than one result
Пример
Давайте обработаем исключение и вернём корректный ответ, если записей несколько. Для этого используем метод getResult вместо getSingleResult:
<?php
namespace App\Controller;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/articles', name: 'article_list')]
public function list(EntityManagerInterface $em): Response
{
$query = $em->createQuery('SELECT a FROM App\Entity\Article a');
$res = $query->getResult();
if (count($res) > 1) {
return new Response('Found ' . count($res) . ' articles');
}
return new Response($res[0]->getTitle());
}
}
?>
Результат выполнения кода при наличии трёх статей:
"Found 3 articles"
Смотрите также
-
исключение
NoResultException,
которое возникает при отсутствии результата -
исключение
EntityNotFoundException,
которое сигнализирует об отсутствии сущности -
исключение
ORMInvalidArgumentException,
которое возникает при неверных аргументах ORM -
исключение
DBALException,
которое выбрасывается при ошибках DBAL