вторник, 20 апреля 2010 г.

Грабля: ругается, что такая запись уже есть в БД

Проблема: при редактировании объекта и отправке формы Доктрина ругается, что
An object with the same "email" already exist
при том, что мы совешенно уверены, что такой email в базе ровно один - у редактируемого объекта. В чем дело? Если случилось так, что форма редактирования объекта содержит embedded-форму, то скорее всего проблема в следующем.
Как работает валидатор уникальности? Проверяет, есть ли в БД запись с таким значением поля, и id, отличным от id сохраняемого объекта. Если находит, то выдает ошибку валидации - "already exists". А теперь посмотрим внимательно на то, как мы встраиваем одну форму в другую. И наверняка найдем строчки вида
unset($this['id'],$this['user_id']);

Так-так... id удалили? Значит уник-валидатор найдет запись с таким email и id!=null.

Что же делать?

Два варианта.
1. Проверять уникальность только в том случае, если значение поля поменялось (имхо, гемор)
2. Лучше так:
    if ($this->isNew())
    {
      unset($embedded_form['id'],$embedded_form['user_id']);
    }

То есть мы удаляем id только в том случае, если создаем новый объект (это нужно для избежания дублирования записей в БД). Если редактируем имеющийся, то id удалять не нужно, т.к. в это поле подставляется уже сохраненное в БД значение, и связь не нарушится.

Комментариев нет:

Отправить комментарий