我使用Managing Roles in the Database
示例将我的用户和角色保存到数据库中。我想使用带有User
的{{1}}字段制作Roles
表单,因此我可以使用复选框选择特定用户的所有角色。我还想要一个带有multiple=true
字段的Role
表单,以便我可以为该角色选择用户。
保存与实体字段的Users
关系并不顺利,所以我找到了this question。给出的答案确实解决了问题,但仍然存在问题。 ManyToMany
表单只选择一个User
,而Role
表单选择(并保存)多个用户。保存ManyToMany关系仅适用于所有者。这个问题是mentioned in the comments。
如何在双方保存ManyToMany关系?
我已使用此代码制作表单:
UserType.php:
Role
表单数据
发布表单(选中多个角色)时,只发布一个角色:
class UserType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('username')
->add('roles', 'entity', array(
'class' => 'UserBundle:Role',
'property' => 'name',
'multiple' => true,
'expanded' => true
))
;
}
}
呈现的HTML表单似乎是正确的:
_method:PUT
acme_appbundle_user[username]:paul
acme_appbundle_user[email]:paul@*****.nl
acme_appbundle_user[isActive]:1
acme_appbundle_user[roles][]:3
acme_appbundle_user[_token]:cknUf8psN1k9FBN9GLY4i7bY0Y6FugNhjgudkpKKw-k
解决方案
我发现了问题。我正在使用函数用$ .ajax()发布所有数据,但该函数没有很好地通过数组。我删除了那段无用的代码。我找到了解决方案,但我会继续寻找给我无用代码的开发人员; - )。
答案 0 :(得分:1)
理论上,如果你通过像解释here之类的setter来同步你的关系,它应该始终有效,但请记住,你有责任保持这种同步:)
编辑:我的意思是你的代码看起来像:
class User
{
// ...
function setRoles(array $role)
{
$this->roles->clear();
foreach ($roles as $role) {
$this->addRole($role);
}
}
function addRole(Role $role)
{
$this->roles->add($role);
// Bidirectional synchronization
if (!$role->getUsers()->contains($this)) {
$role->addUser($this);
}
}
}
在这里,我给出了User类的示例,但您需要在Role类中以相同的方式同步双向关系。