将ManyToMany关系与实体字段保存(拥有/反向)

时间:2014-06-03 09:08:56

标签: symfony doctrine-orm symfony-forms

我使用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
            ))
        ;
    }
}

Screenshot form+console

呈现的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()发布所有数据,但该函数没有很好地通过数组。我删除了那段无用的代码。我找到了解决方案,但我会继续寻找给我无用代码的开发人员; - )。

1 个答案:

答案 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类中以相同的方式同步双向关系。