UniqueEntity не проверяет с обновлением

С помощью Доктрина и Symfony 4.1 я создаю объект User с помощью UniqueEntity

/**
 * User
 * 
 * @ORM\Entity(repositoryClass = "App\Repository\UserRepository")
 * @ORM\Table(name = "user")
 * @UniqueEntity(
 *     fields = "email",
 *     message = "email.already_taken"
 * )
 */
class User {
    ...
  • При регистрации (INSERT) выдается ошибка: хорошо
  • Когда я обновляю (UPDATE) пользователя с другим существующим адресом электронной почты, у меня появляется ошибка: фигово

An exception occurred while executing 'UPDATE user SET email = ? WHERE id = ?' with params ["[email protected]", 14]:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '[email protected]' for key 'UNIQ_8D93D649E7927C74'

Почему UniqueEntity не тестирует обновление?

Вы используете формы Symfony?

Fabian Schmick 30.11.2018 11:44

Да, я использую форму Symfony :)

Gaylord.P 30.11.2018 11:49

Не могли бы вы отредактировать свой вопрос с помощью фрагментов контроллера и формы?

Fabian Schmick 30.11.2018 11:52

Подождите, попробуйте этот fields = {"email"}

Fabian Schmick 30.11.2018 11:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
4
536
3

Ответы 3

вы можете добавлять группы в ограничение groups = {"new", "edit"}. Затем используйте эти группы в формах, подобных описанному здесь

Как мы это делаем для API?

Unnikrishnan 23.10.2020 18:40

Может быть, попробовать проверить сущность перед сбросом? https://symfony.com/doc/4.1/validation.html#using-the-validator-service

$errors = $validator->validate($updatedUser);

if (count($errors) > 0) {
    $errorsString = (string) $errors;

    return new Response($errorsString);
}

Ошибки должны содержать информацию о том, что пользователь уже существует.

Для объявления вам необходимо добавить обратные вызовы жизненного цикла и добавить Doctrine UniqueConstraint.

use Doctrine\ORM\Mapping\UniqueConstraint;

/**
 * User
 * @ORM\HasLifecycleCallbacks()
 * @ORM\Entity(repositoryClass = "App\Repository\UserRepository")
 * @ORM\Table(name = "user", uniqueConstraints{@UniqueConstraint(columns = {"email"})})
 * @UniqueEntity(
 *     fields = "email",
 *     message = "email.already_taken"
 * )
 */
class User {}

/**
 * @ORM\PrePersist
 */
public function setCreatedAtValue()
{
    $this->createdAt = new \DateTime();
}

больше информации https://symfony.com/doc/4.1/doctrine/lifecycle_callbacks.html

Другие вопросы по теме