РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
542 of 1361 menu

Исключение 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
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить