Doctrine2 - 如何在添加新关联时删除 ManyToMany 关联

Doctrine2 - How to remove ManyToMany associations on add of new ones

我快速浏览了一下,但找不到答案。

采用以下实体,可以具有多个角色的用户:

/**
* @Entity
**/

class User 
{

    /**
    * @ManyToMany(targetEntity="Role", inversedBy="users")
    * @JoinTable(name="user_to_roles")
    **/ 
    protected $roles;

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

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

    public function getRoles()
    {
        return $this->roles;
    }
}

和角色:

/**
* @Entity
**/

class Role
{
    /**
    * @Id
    * @Column(type="integer")
    * @GeneratedValue(strategy="AUTO")
    **/
    protected $id;

    /**
    * @ManyToMany(targetEntity="User", mappedBy="roles")
    **/
    protected $users;

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

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

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

当我想更新一个用户时,我会得到参考,然后像这样更新:

$user = $this>entityManager->getReference('App\Entity\User', $id);
$user->addRole($role);
$this->entityManager->persist($user);
$this->entityManager->flush();

但是,这会不断向我的关系添加新角色 table,而我只想更新当前行,或删除它并创建一个新角色(以更容易的为准)。我怎样才能做到这一点?

尝试将此功能添加到您的实体中:

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

当你更新时试试这个:

$user = $this>entityManager->getReference('App\Entity\User', $id);
$roles = array();

// add your roles to the array roles

$user->setRoles($roles);    
$this->entityManager->persist($user);
$this->entityManager->flush();