我有3个表,User,Roles和UserRoles。用户只能有一个角色,但我不想在User表中为角色添加一个列,问题是我想在用户表单中添加一个ObjectSelect,但是它将它打印为多个Select ,我不想要,我尝试添加removeAttribute('multiple'),但我得到一个错误说:
“当元素没有将多个属性设置为布尔值true时,FormSelect不允许指定多个选定值”
添加多个:false,也不起作用,所以我想弄明白,这就是代码。
用户实体:
/**
* @ORM\ManyToMany(targetEntity="Auth\Entity\User\Roles")
* @ORM\JoinTable(name="userRole",
* joinColumns={@ORM\JoinColumn(name="idUser", referencedColumnName="id", unique=true)},
* inverseJoinColumns={@ORM\JoinColumn(name="idRole", referencedColumnName="id")}
* )
* @Annotation\Type("Zend\Form\Element\ObjectSelect")
* @Annotation\Required({"required":"true"})
* @Annotation\Options({"label":"Rol","target_class":"Auth\Entity\User\Roles","property":"name"})
* @Annotation\Attributes({"class":"form-control"})
**/
private $roles;
public function __construct() {
$this->roles = new ArrayCollection();
}
public function getRoles()
{
return $this->roles->getValues();
}
AdminController添加操作:
public function addUserAction () {
$view = new ViewModel();
$userEntity = new User();
$em = $this->entityManager();
$builder = new DoctrineAnnotationBuilder($em);
$form = $builder->createForm($userEntity);
$form->setHydrator(new DoctrineHydrator($em, 'Users\Entity\User'));
$form->bind($userEntity);
$request = $this->getRequest();
if ($request->isPost()) {
$form->setData($request->getPost());
if ($form->isValid()) {
$em->persist($userEntity);
$em->flush();
}
}
$view->form = $form;
return $view;
}
我的观点:
$form = $this->form;
$form->setAttribute('action', $this->url('admin', array('action' => 'addUser')));
$form->prepare();
echo $this->form()->openTag($form);
echo $this->formRow($form->get('username'));
echo $this->formRow($form->get('email'));
echo $this->formRow($form->get('roles'));
echo $this->formSubmit($form->get('submit'));
echo $this->form()->closeTag();
答案 0 :(得分:0)
如果用户只能拥有一个角色,为什么会有多对多关系?
Select正在渲染时出现错误。 the ObjectSelect value is validated通过函数 validateMultiValue 的时刻。
功能代码是:
protected function validateMultiValue($value, array $attributes)
{
if (null === $value) {
return array();
}
if (!is_array($value)) {
return (array) $value;
}
if (!isset($attributes['multiple']) || !$attributes['multiple']) {
throw new Exception\DomainException(sprintf(
'%s does not allow specifying multiple selected values when the element does not have a multiple attribute set to a boolean true',
__CLASS__
));
}
return $value;
}
您定义用户实体的方式,您将始终拥有一个数组:
(...)
public function __construct() {
$this->roles = new ArrayCollection();
}
(...)
所以它始终到达最后一个,如果它检查多个属性。因为您不希望它是多个,所以将此属性设置为false,这是错误引发的时间。如果它验证了一个数组,那么select应该是多个。
如果更改关系,则代码应该有效。你可以尝试多对一。这样,您可以从角色实体获得具有XXX角色的所有用户。从用户方面来说,您可以获得用户所拥有的唯一角色。
修改强>
抱歉,现在我明白为什么你有多对多的关系。它是与连接表的一对多关系。似乎没有一对一的连接表......通常的方法我认为应该将角色列放在用户表中,但你不能。您需要角色属性为角色实体,而不是角色实体的数组。