@Multu

Как сделать проверку на уникальность данных?

Всем привет!
Мне необходимо в базу ложить уникальные email. Так вот, почитал документацию и настроил сущность следующим образом:
/**
 * @ORM\Table(name="subscribe")
 * @ORM\Entity(repositoryClass="App\PalermoBundle\Repository\SubscribeRepository")
 * @UniqueEntity("email")
 */
class Subscribe
{
    /**
     * var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * var string
     * @ORM\Column(name="email", type="string", length=255, unique = true)
     */
    private $email;

    /**
     * var string
     * @ORM\Column(name="male", type="string", length=10)
     */
    private $male;
}


На уровне базы существующий email в базу не падает, но при сохранении $em->flush() выбрасывается исключение из-за того что данные уже есть.
Как я могу сделать проверку перед сохранением?

Нашел на эту тему FAQ
Doctrine не проверяет не добавляете ли вы в базу данных сущности с уже дублирующимися ключами PRIMARY, или не добавляете ли вы дважды в коллекцию одну и ту же сущность. Если есть какие-то опасения на этот счет, всегда можно сделать соответствующую проверку перед вызовом $em->flush().

В Symfony2 для этого существует соответствующий компонент под названием Unique Entity Validator.

Проверить содержит ли коллекция заданную сущность можно с помощью метода $collection->contains($entity). Для коллекции с параметром FETCH равным LAZY этот метод просто инициализирует коллекцию, однако если FETCH равен EXTRA_LAZY, то для проверки принадлежности Doctrine выполнит SQL-запросы.


Только вот никак не разберусь как это применить можно. Как получить объект $collection? Ребята помогите пожалуйста
  • Вопрос задан
  • 2727 просмотров
Пригласить эксперта
Ответы на вопрос 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Что бы провалидировать нужен валидатор. Ваш капитан очевидность. В Symfony это отдельный компонент. Либо ловите эксепшен и обрабатывайте, но это не очень себе вариант.
Ответ написан
Комментировать
@Multu Автор вопроса
Сергей Протько, спасибо что подтолкнули в нужную сторону. Решается проблема так:
$errors = $this->get('validator')->validate( $subscribe );
            if ( ! count( $errors ) ){
                $em = $this->getDoctrine()->getEntityManager();
                $em->persist($subscribe);
                $em->flush();
            }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы