Въпрос относно роли за потребителите
Здравейте
Опитвам се да направя форма с която да менажирам ролите на потребителите.
Използвам начина за ролите от урока на Веселин Малезанов. Имам 3 таблици - users, roles и user_roles
Пропъртито roles в ентито User има следната анотация:
/**
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Role")
* @ORM\JoinTable(name="user_roles",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")})
* @var Collection|Role[]
*/
private $roles;
също така в ентитито User имам и конструктор, ще дам и сетърите и гетърите на roles
public function __construct()
{
$this->roles = new ArrayCollection();
}
public function getRoles()
{
$roles = [];
foreach ($this->roles as $role){
$roles[] = $role->getName();
}
return $roles;
}
public function setRoles($role){
$this->roles = $role;
return $this;
}
При всяка регистрация автоматично слагам роля с id=1, от таблицата roles. Така всеки получава най ниската роля - ROLE_USER. Това работи.
Искам обаче когато админа променя данните на потребителя да може да му промени ролята. Опитвай се да го направя така, давам част от формата за редакция:
$form = $this->createFormBuilder($user)
->add('userName', TextType::class)
->add('fullName', TextType::class)
->add('cash', TextType::class)
->add('usedCash', TextType::class)
->add('email', EmailType::class, array('label' => 'E-mail'))
->add('roles', EntityType::class, array(
'class' => 'AppBundle:Role',
'query_builder' => function (RoleRepository $er) {
return $er->createQueryBuilder('u')
->orderBy('u.name', 'ASC');
},
'choice_label' => 'name',
))
->add('save', SubmitType::class, array('label' => 'Save'))
->getForm();
Това вече работи дотам, че само ми показва наличните роли. Когато изпратя формата, ми дава следната грешка:
http://www.img-share.eu/f/images/451/errorzsRkLvM44zlHDqvhnCB31513091042.png
Доколкото четох, това идва от релацията ManyToMany. Трябвало да я променя. На мен ми върши работа и всеки потребител да има 1 роля, важното е да мога да я променям.
Идея как да го направя? В краен случай мога да направя някой метод със сурав SQL код и директно да правя заявки към таблицата user_roles. Но ми се струва изключително кофти начин.
Много благодаря.
Нямаше нужда от промяната на реда за ОРМ анотацията.
Направих го така:
Сега наистина ги сетва.
Премахва другите ако има такива.
Определяш entity-то което е притежаващо. В случая User entity.
От другата страна слагаш mappedBy - за притежавано entity: