UniqueEntity не проверять с обновлением - PullRequest
0 голосов
/ 30 ноября 2018

С Доктриной и 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) пользователя другим существующим электронным письмом , у меня появляется ошибка: не хорошо

Исключительная ситуация при выполнении 'ОБНОВЛЕНИЕ пользователя SET email =?ГДЕ id =? 'с параметрами ["user22@me.world", 14]:

SQLSTATE [23000]: нарушение ограничения целостности: 1062 Повторяющаяся запись 'user22@me.world' для ключа 'UNIQ_8D93D649E7927C74'

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

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Может быть, попробовать проверить сущность перед сбросом?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);
}

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

0 голосов
/ 04 декабря 2018

Для анонса вы должны добавить обратные вызовы жизненного цикла и добавить 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

0 голосов
/ 30 ноября 2018

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

...