2012-03-15 66 views
16

我在symfony中创建了2个实体:多对多关系中的用户和角色。这意味着每个用户都可以拥有更多角色,并可以为许多用户设置角色。symfony2多对多表格复选框

用户等级:

/** 
    * @ORM\Entity 
    * @ORM\Table(name="JEP_User") 
    * @ORM\Entity(repositoryClass="Chrchel\JepBundle\Repository\UserRepository") 
    */ 
class User implements AdvancedUserInterface { 

/** 
* @ORM\Id() 
* @ORM\Column(name="id",type="integer") 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @ORM\Column(name="username",type="string",length=100,unique=true) 
*/ 
private $username; 

/** 
* @ORM\ManyToMany(targetEntity="Role", inversedBy="users") 
* 
*/ 
protected $roles; 

//.... 
} 

角色类:

/** 
* @ORM\Table(name="JEP_Role") 
* @ORM\Entity() 
*/ 
class Role implements RoleInterface { 

/** 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id() 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 

    /** @ORM\Column(name="name", type="string", length=30) */ 
protected $name; 

/** @ORM\Column(name="role", type="string", length=20, unique=true) */ 
protected $role; 

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

我无法弄清楚如何谱写出的Symfony2查询生成器列出存在的所有角色,并把它添加到年底UserForm的角色可以选择(作为复选框)授予用户的角色。 我试图用收集像这样的用户类型

->add('roles', 'collection',array('label' => 'Role', 'required' => false,'type'=> new RoleType())) 

我从symfony中获得的最好用文本框行与角色选定的名称。但这不是,我需要。

回答

30

我用实体类型代替收藏。我收集的东西主要用于创建 a Role对象,并将其分配给User

如果你想只列出所有现有的角色和能够选择并将其分配给那么用户:

->add('roles', 'entity', array(
    'class' => 'MyBundle:Role', 
    'property'  => 'name', 
    'multiple'  => true 
)); 

编辑:这将使小部件为多<select>,请参阅entity type呈现为复选框列表。

+8

将“expanded”选项设置为“true”以具有复选框列表。你需要在角色模型上实现'__toString()'方法(用于在每个复选框旁边显示标签 – GiDo 2012-03-15 17:10:13

+1

我发现我必须向User实体添加另一个方法才能将角色作为Collection返回,而不是as一个数组 - getRolesAsCollection。 – 2012-04-18 10:36:57

+2

你如何调用这个特定的'getRolesAsCollection'和where? – 2012-05-24 19:15:27

6

@ user1041880:如果您使用symfony的安全功能(这需要个EUSER的角色,作为一个数组),你可以做这样的:

->add('rolesAsCollection', 'entity', array(
    'class' => 'MyBundle:Role', 
    'property'  => 'name', 
    'multiple'  => true 
)); 

而用户等级:

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

Symfony3:

在任何人的情况下,使用Symfony3

use Symfony\Bridge\Doctrine\Form\Type\EntityType; 

->add('roles', EntityType::class, array(// <-- EntityType::class is unique to Symfony3 
    'class' => 'AppBundle:Role', 
    'choice_label' => 'name', // <-- choice_label is unique to Symfony3 
    'multiple' => true 
)) 
+0

我有与上面完全相同的格式(Symfony 3:答案4)。'roles'代表的字段已被设置为ManyToMany。有没有设置使用ArrayCollection()(也试过没有)。无论哪种方式,我得到一个错误,并不能为我的生活找出它想要的一些反馈 – LoveFineArt 2017-10-01 21:05:37

+0

我有完全相同的格式如上(Symfony 3:答案4)'角色'表示的字段已被设置为ManyToMany,我使用ArrayCollection()进行设置(也没有尝试过)。无论哪种方式,我都会遇到一个错误,并且无法为我的生活弄清楚。会爱一些fe edback。没有ArrayCollection:ERROR =“无法转换属性路径的用户值”:期望一个Doctrine \ Common \ Collections \ Collection对象。“ – LoveFineArt 2017-10-01 21:19:25