У меня есть регистрационная форма с электронной почтой, которая должна быть уникальной. Что я хочу сделать, так это то, что если кто-то заполнит электронное письмо, которое уже зарегистрировано для другого пользователя, это кто-то, чтобы увидеть сообщение, написанное мной, а не что-то вроде

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'admin@domain.com' for key 'UNIQ_1483A5E9E7927C74'

Я пробовал это в классе репозитория:

public function getSameFriends ($email)
    {
        $q = $this->createQueryBuilder('f');

        $q->select('f')
          ->where('f.email = :email')      
          ->setParameter('email', $email);

        return $q->getQuery()->getSingleScalarResult();
    }

А затем это в контроллере:

$em = $this->getDoctrine()->getEntityManager();
        $count = $em->getRepository('EMMyFriendsBundle:Friend')
                                    ->getSameFriends($friend->getEmail());
        if($count != 0)
        {
            $this->get('session')->setFlash('notice', 'There already is a friend with this email!');
            return $this->redirect($this->generateUrl('home_display'));
        }

Но у меня есть исключение, что

No result was found for query although at least one row was expected.
500 Internal Server Error - NoResultException

Мне не нужен результат запроса, просто чтобы знать, 1 или 0 результат. Вы знаете, как это сделать?

1
Faery 13 Сен 2012 в 11:53

1 ответ

Лучший ответ

Ты можешь сделать:

return count($q->getQuery()->getResult());

Кстати, вы смотрели на ограничение валидации uniqueEntity? Он предоставляет необходимые вам функциональные возможности прямо из коробки:

http://symfony.com/doc/current/reference/constraints/UniqueEntity.html

3
Carlos Granados 13 Сен 2012 в 12:01
1
Альтернативный подход, чтобы просто подсчитать: stackoverflow .com / questions / 9214471 /… И имейте в виду, что всегда существует небольшая вероятность того, что другой пользователь может отправить такое же электронное письмо в период между временем вашего запроса и выполнением вашего контроллера. Так что вы также должны окружить свою вставку попыткой / уловом на всякий случай.
 – 
Cerad
13 Сен 2012 в 18:28