Symfony2 Doctrine throw NonUniqueResultException

У меня проблема с вызовом NonUniqueResultException в моем запросе

public function getLastViewUpdate($view)
{
    $qb = $this->getEntityManager()->createQueryBuilder();

    $result = $qb->select('vu')
        ->from('EasyApp\ApplicationBundle\Entity\ViewUpdate', 'vu')
        ->where('vu.view = :view')
        ->orderBy('vu.date','DESC')
        ->setParameter('view', $view)
        ->getQuery()
        ->getSingleResult();

    return $result;
}

Но я не знаю, почему, я могу что-то импортировать, но я не могу найти

CRITICAL - Uncaught PHP Exception Doctrine\ORM\NonUniqueResultException: "" at /Users/antoine/Documents/projects/easyApp/application/vendor/doctrine/orm/lib/Doctrine/ORM/AbstractQuery.php line 621 

Спасибо за помощь

Ответ 1

Вы можете проверить декларацию функции getSingleResult

/**
 * Gets the single result of the query.
 *
 * Enforces the presence as well as the uniqueness of the result.
 *
 * If the result is not unique, a NonUniqueResultException is thrown.
 * If there is no result, a NoResultException is thrown.
 *
 * @param integer $hydrationMode
 * @return mixed
 * @throws NonUniqueResultException If the query result is not unique.
 * @throws NoResultException If the query returned no result.
 */
public function getSingleResult($hydrationMode = null)
{
    ...
    if (count($result) > 1) {
        throw new NonUniqueResultException;
    }
    ...
}

Чтобы решить проблему, вы можете установить LIMIT запрос и получить только один результат с помощью ->setMaxResults(1).

Ответ 2

Не используйте getSingleResult, если вы ожидаете более одного результата... Используя эту функцию, вы выполняете однозначную проверку своего результата, это намерение этой функции.

Множество вариантов:

  • Используйте getSingleResult и обработайте исключение (например, try {...} catch (NonUniuqueResultException $e) {...}) или настройте структуру базы данных, чтобы избежать дублирования,
  • Используйте getSingleResult и добавьте setMaxResults(1), но это действительно странный способ доверять вашей модели БД,
  • Используйте getResult и сделайте что-нибудь с возвращенными результатами.

Ответ 3

Это просто означает, что у вас есть два или более ViewUpdates с одним и тем же представлением.