Symfony2 - ManyToMany - 无法仅更新拥有方

时间:2014-09-19 00:13:11

标签: php symfony doctrine-orm many-to-many

我在User表和Role表之间有一个ManyToMany关系。用户表是拥有者。我的问题是,当我将数据保存到User表中时," user_role" table(这是关系的帮助表)不会更新。

AccountController.php:

$user = $registration->getUser(); // all the user data works

$em->persist($user);
$em->flush();

user.php的:

/**
     * @ORM\ManyToMany(targetEntity="Role", inversedBy="users")
     * @ORM\JoinTable(name="user_role",
     *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")}
     * )
     *
     */

    private $roles;

    public function __construct()
    {
        $this->roles = new ArrayCollection();
    }

    // trying to assign this role by default
    public function getRoles()
    {
        return array('ROLE_ADMIN');
    }

    public function addRole(Role $role) {
        $this->roles[] = $role;
        $role->addUser($this);

        return $this;
    }

Role.php:

/**
     * @ORM\ManyToMany(targetEntity="User", mappedBy="roles")
     * @ORM\JoinTable(name="user_role",
     *      joinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}
     * )
     */
    private $users;

    public function __construct()
    {
        $this->users = new ArrayCollection();
    }

    public function getRole()
    {
        return $this->role;
    }

    public function setRole($role)
    {
        $this->role = $role;
    }


    public function addUser(User $users)
    {
        $this->users[] = $users;

        return $this;
    }

    public function getUsers()
    {
        return $this->users->toArray();
    }

我意识到我甚至没有在控制器中使用addRole。但为此,我必须坚持角色(否则是致命的错误),如果我这样做,那么它将是Role表中的重复条目。


基本上我的问题简要说明:如何在更新user_role表的同时在数据库中保存新用户,而无需添加/复制新角色?

任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:2)

好的,它已经解决了!

基本上,它一直试图复制Role表中的条目的原因是因为我创建了一个新实体并尝试将其添加为角色。这是错误的代码:

$role = new Role();
$role->setName('admin');
$role->setRole('ROLE_ADMIN');
$user->addRole($role);

这就是我应该做的:获取我想从数据库中分配的现有角色:

$role = $em->getRepository('NameYourBundle:Role')->findOneBy(array('name' => 'admin'));
$user->addRole($role);
$em->persist($user); // persisting only the user. 
$em->flush();

添加此现有角色后,帮助程序表将相应更新!