Symfony - обновление уникального столбца - проблема проверки - PullRequest
2 голосов
/ 02 июля 2010

Я новичок в Symfony Framework и столкнулся с проблемой при проверке формы.

Я хочу обновить данные в БД, включая уникальный столбец, но если уникальный столбец не изменился, возвращается ошибка (Anобъект с таким же "доменом" уже существует. "). Столбец домена должен быть уникальным, но пользователь должен иметь возможность его изменить. Таким образом, если один пользователь сохраняет свое доменное имя, никто не может его использовать, но он может изменить его.в будущем.

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

Какую проверку я должен использовать для сохранения уникальности столбца, но его можно изменить?

Ответы [ 5 ]

4 голосов
/ 31 августа 2011

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

В моем случае Validator не возвратил true для метода isUpdate (), это было потому, что поле 'id' было не установлено.

Чтобы избежать этой проблемы, удалите id из неустановленных полей и измените его на sfWidgetFormInputHidden.

3 голосов
/ 02 июля 2010

Если вы используете Doctrine, а валидатор - sfValidatorDoctrineUnique , он должен работать как положено.

Т.е. проверяет, обновляете ли вы объект. См. Строку 102.

2 голосов
/ 02 апреля 2013

чтобы сделать isUpdate (), вы должны использовать $ this-> form-> setPostValidator ();

$ this-> validatorSchema-> setPostValidator (новый sfValidatorDoctrineUnique (array ('model' => 'Model)',' column '=>' column_name ')));

1 голос
/ 22 марта 2011

Вы частично правы, но проблема в том, что если кто-то захочет изменить другое поле, оставаясь неизменным, проблема остается. Я не вижу способа предотвратить это, кроме как сделать это самостоятельно: /

0 голосов
/ 11 мая 2015

Вы должны использовать merge вместо persist

Например:

$entityManager = $this->getDoctrine()->getManager();
$loadedBrand = $entityManager->merge($loadedBrand);
$entityManager->flush();
...