У меня есть отношения ManyToMany между таблицей пользователя и таблицей ролей. Пользовательская таблица является владельцем. Моя проблема заключается в том, что когда я сохраняю данные в таблице User, таблица user_role (которая является вспомогательной таблицей отношений) не обновляется.
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 в контроллере. Но для этого я должен был бы также сохранить роль (иначе фатальная ошибка), и если я это сделаю, то это будет дублирующая запись в таблице ролей.
В основном мой вопрос вкратце: как сохранить нового пользователя в базе данных при обновлении таблицы user_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();
После добавления этой существующей роли таблица помощников будет обновлена соответствующим образом!
Других решений пока нет …