ユーザー、メンバー プロファイル、およびメンバー組織という 3 つの異なるオブジェクトを含むユーザー登録フォームに取り組んでいます。これらすべてをユーザー>メンバー>学校のような単一の登録フォームに埋め込もうとしています。これの基本的な実装は、典型的なsfDoctrineForm::embedRealtion
手順で問題なく機能します。
問題は、組織が に一意のインデックスを持っていることmember_number
です。これに指定された値がデータベースに存在しないのは、そのユーザーが組織から最初にサインアップしたときだけです。したがって、この場合、検証エラー (検証をオフにするとキー制約違反) が発生します。
私が代わりにやりたいことは、データベース内で同じMemberOrganizationの存在をチェックすることですmember_number
(プリ/ポストバリデーターまたは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