Я работаю над формой регистрации пользователя, которая включает в себя 3 различных объекта: пользователя, профиль участника и организацию участника.Я пытаюсь встроить все это в одну регистрационную форму, как Пользователь> Пользователь> Школа.Базовая реализация этого прекрасно работает с типичной процедурой sfDoctrineForm::embedRealtion
.
Проблема в том, что организация имеет уникальный индекс на member_number
, единственный раз, когда предоставленное значение для этого не будет вбаза данных - это когда пользователь первым регистрируется в своей организации.Так что в этом случае мы получим ошибку проверки (или нарушение ключевого ограничения, если мы отключим проверку).
Вместо этого я хочу, чтобы я проверил существование MemberOrganization с тем жеmember_number
в базе данных (либо в валидаторе pre / post, либо в updateObject, либо там, где это уместно).Если номер участника уже существует, я хочу связать новый MemberProfile с этой существующей организацией, а не связывать его с новой отправленной, выбрасывая все новые значения для этой организации.
Я попытался изменитьобъект в форме организации посредством проверки, но это всегда приводит к нарушению ограничения organization_id
, исходящему из профиля:
$object = $this->getObject();
$table = $object->getTable();
$existing = $table->findOneByMemberNumber($values['member_number']);
if($existing)
{
$members = clone $object->Members;
$object->assignIdentifier($existing->identifier());
$object->fromArray($existing->toArray(false), false);
foreach($members as $member)
{
$member->link($object);
}
$values = $object->toArray(false); // return only the direct values
}
return $values;
Схема выглядит примерно так:
User:
columns:
username: {type: string(100)}
email: {type: string(255), unique: true}
MemberProfile:
columns:
# some none authentication related user details
organization_id: {type: integer, notull: true}
user_id: {type: integer, notnull: true}
relations:
User:
local: user_id
type: one
foreign: id
foreignType: one
MemberOrganization:
local: orgainization_id
type: one
foreign: id
foreignType: many
foreignAlias: Members
MemberOrganization:
columns:
membership_number: {type: string(255), unique: true}
# other organization data