Symfony2 - 表单集合 - 更新-ManytoMany-Relation

时间:2014-12-29 20:26:57

标签: php symfony

我对Symfony2很新,现在我遇到了一系列表单问题。我有两个实体。实体用户和实体角色。

实体用户

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

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

/**
 * @ORM\Column(type="string", length=32)
 */
private $salt;

/**
 * @ORM\Column(type="string", length=250)
 */
private $password;

/**
 * @ORM\Column(type="string", length=60, unique=true)
 */
private $email;



/**
 * @ORM\Column(name="is_active", type="boolean")
 */
private $isActive;

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

实体角色

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

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

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

/**
 * @ORM\ManyToMany(targetEntity="User", mappedBy="roles")
 * @ORM\JoinTable(name="user_role",
 *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")}
 *      )
 */
private $users;

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

控制器

public function editUserAction($id, Request $request)
{
    $em = $this->getDoctrine()->getManager();
    $user = $em->getRepository('PsoLogBundle:User')->find($id);
    $form =  $this->createForm(new NewUserType(),$user);
    $form->handleRequest($request);
    if (!$user) {
        throw $this->createNotFoundException(
            'No news found for id ' . $id
        );
    }


    if ($form->isValid()) {
        $em->flush();
    $this->get('session')->getFlashBag()->add('notice', 'User updated successfully');
    }

    $build['form'] = $form->createView();

    return $this->render('PsoLogBundle:Security:editUser.html.twig', $build);

}

现在我有一个包含用户和角色的表单集合,这些表单保存在用户的数据库中。当我对角色进行更改时,我收到了错误"执行' UPDATE pso_role SET role =?时发生异常? WHERE id =?'用params [" ROLE_ADMIN",2]"

问题是Symfony想要在实体角色的表上进行更改。实际上,它应该是表中关于User - Role关系的新条目。我在谷歌和这里搜索了stackoverflow,但我无法找到我必须改变的东西。

我认为问题可能是formbuilder

$builder ->add('username','text', array('label' => 'Username')) 
     ->add('email','email', array('label' => 'Email')) 
     ->add('isActive','text', array('label' => 'User aktiv')) 
     ->add('Roles', 'collection', array('type' => new RoleType())) 
     ->add('Submit', 'submit', array( 'attr'=> array ( 'formnovalidate' => 'formnovalidate' )));

可能是,行添加('角色','集合',数组('类型' =>新的RoleType()))定义实体,应该更新?我能改变吗

如果我不将它与表单集合一起使用,但只使用单个表单,一切正常,因为只有一个实体受到影响。如果有人能给我一个提示,我会很高兴的。

现在我在Formbuilder中试过了      - >添加('角色','实体',数组('类' =>' PsoLogBundle:角色',' ; property' =>' role'))

然后我得到错误"属性"角色"也没有其中一种方法" setRoles()"," __ set()"或" __ call()"在课堂上存在并拥有公共访问权限" Pso \ LogBundle \ Entity \ User"。 "

我尝试在实体用户中插入setter

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

然后我得到错误ContextErrorException:Catchable Fatal Error:传递给Pso \ LogBundle \ Entity \ User :: setRoles()的参数1必须是Pso \ LogBundle \ Entity \ ArrayCollection的实例,Pso \ LogBundle \ Entity的实例\赋予角色,在第347行的C:\ xampp \ htdocs \ pso \ vendor \ symfony \ symfony \ src \ Symfony \ Component \ PropertyAccess \ PropertyAccessor.php中调用,并在C:\ xampp \ htdocs \ pso \ src \ Pso中定义\ LogBundle \ Entity \ User.php第99行

我尝试用

来解决问题
      'multiple' => false,
就像我在here

中找到的一样

但这并没有改变这种情况。

我在user.php中添加了角色的设置器

// Important
public function setRoles($roles)
{
    foreach($roles as $p)
    {
        $po = new user_role();

        $po->setUser($this);
        $po->setRoles($p);

        $this->addPo($po);
    }

}   

当我这样做并生成新的setter和getter时,我没有错误,当我更改用户的角色时,但是在DB中,条目不会改变。

经过几个小时的搜索,我现在就开始工作了。之前的二传手是对的。另外我更改了formbuilder,如

->add('roles', 'entity', array('class' => 'PsoLogBundle:Role','property' => 'role','multiple' => true,))

现在,当我提交表单时,角色会正确更改。感谢evereybody回答,以便我找到正确的方向。我希望,现在一切正常。

问候 米莎

1 个答案:

答案 0 :(得分:0)

您应该拥有用户实体:

    /**
     * @ORM\ManyToMany(targetEntity="Role", inversedBy="users")
     * @ORM\JoinTable(name="role_assigned_to_user",
     *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")}
     *      )
     */
    private $roles;

在您的角色实体中:

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

在你的角色构造函数中:

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

而不是收集它将多选:

->add('roles', 'entity', array(
            'class' => 'YourBundle:Role',
            'property' => 'name',
        ))