Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony2-表单集合-更新-多个关系_Php_Symfony - Fatal编程技术网

Php Symfony2-表单集合-更新-多个关系

Php Symfony2-表单集合-更新-多个关系,php,symfony,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\

我是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);

}
现在我有了一个包含用户和角色的表单集合,这些表单保存在数据库中供用户使用。当我对角色进行更改时,出现错误“在使用参数[“Role\u ADMIN”,2]执行“UPDATE pso\u Role SET Role=?WHERE id=?”时发生异常”

问题是Symfony希望对实体角色的表进行更改。事实上,它应该是关系用户角色表中的一个新条目。我在谷歌和stackoverflow中搜索过,但我找不到需要更改的内容


我认为问题可能出在表单生成器上

$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' )));
行add('Roles','collection',array('type'=>newroletype())是否定义了应该更新的实体?我能换这个吗

如果我不将它用于表单集合,而仅用于单个表单,那么一切都可以正常工作,因为这样只影响一个实体。如果有人能给我一个提示,我会很高兴的

现在我在Formbuilder中用 ->添加('roles','entity',array('class'=>'PsoLogBundle:Role','property'=>'Role'))

然后我得到错误“属性“roles”或方法“setRoles()”、“\uuu set()”或“\uu call()”在类“Pso\LogBundle\Entity\User”中均不存在且具有公共访问权限”

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

public function setRoles( ArrayCollection $roles)
{
$this->roles = $roles;
return $this;
}    
然后我得到错误ContextErrorException:Catchable致命错误:传递给Pso\LogBundle\Entity\User::setRoles()的参数1必须是Pso\LogBundle\Entity\ArrayCollection的实例,给定的Pso\LogBundle\Entity\Role的实例,在第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,
就像我发现的那样

但这并不能改变现状

我在user.php中为角色添加了一个setter

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

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

        $this->addPo($po);
    }

}   
当我这样做并生成setter和getter new时,当我为用户更改角色时,不会出现错误,但在DB中,条目不会更改

经过几个小时的搜寻,我终于找到了工作。前面的二传手是对的。此外,我还更改了formbuilder,如

->add('roles', 'entity', array('class' => 'PsoLogBundle:Role','property' => 'role','multiple' => true,))
现在,当我提交表单时,角色将正确更改。谢谢大家的回答,这样我就找到了正确的方向。我希望,现在一切正常

问候
Micha

您的用户实体中应该有:

    /**
     * @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',
        ))

我认为问题可能在于formbuilder[code]$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',array('Submit',数组('attr'=>array('formnovalidate'=>'formnovalidate'));[/code]行add('Roles','collection',array('type'=>newroletype())可能是吗定义应该更新的实体?我可以更改吗?请在OP中添加该代码吗?请共享两个实体的映射字段。您还需要定义第三个表的名称。请参阅此>链接>感谢您的提示。创建实体时,我就这样做了lihttp://symfony.com/doc/current/cookbook/security/entity_provider.html#man数据库中的老化角色现在我定义了映射字段,就像herr的下一个答案一样,但情况是一样的。我在Op中添加了代码谢谢你的提示。情况没有改变。当我创建实体时,我喜欢这样做。这是正确的方法吗?或者你的定义方法是正确的还是更好的方法?