Forms 使用表单值Symfony2框架更新实体

Forms 使用表单值Symfony2框架更新实体,forms,symfony,Forms,Symfony,我使用的是Symfony2框架,我想用表单中的数据更新实体 我使用同一个控制器用一些数据填充表单,同时使用它在数据库中进行更新查询。如果我使用$em->persist($foo),它确实保存了我想要的内容,但我不想像保存新数据一样保存它,我想更新它 阅读symfony2这本书,它说$em->flush()是我们所需要的全部,所以我们可以更新 我想我真的很接近,但我当然错过了一些东西 代码如下: public function actualizarCurriculoAction($id){

我使用的是Symfony2框架,我想用表单中的数据更新实体

我使用同一个控制器用一些数据填充表单,同时使用它在数据库中进行更新查询。如果我使用$em->persist($foo),它确实保存了我想要的内容,但我不想像保存新数据一样保存它,我想更新它

阅读symfony2这本书,它说$em->flush()是我们所需要的全部,所以我们可以更新

我想我真的很接近,但我当然错过了一些东西

代码如下:

public function actualizarCurriculoAction($id){

  $curriculo = new Curriculittle();
  $form = $this->createForm(new CurriculittleType(), $curriculo);
  $request = $this->getRequest();

  if ($request->getMethod() == 'POST') {

     $form->bindRequest($request);

     $lselect=$this->get('request')->request->get('lselect');
     $edad=$this->get('request')->request->get('edad');
     $estado=$this->get('request')->request->get('estadoselect'); 

     if ($form->isValid()) {


        $curriculo->setUsalentes($lselect);
        $curriculo->setEdad($edad);
        $curriculo->setEstado($estado);    

        $em = $this->getDoctrine()->getEntityManager();
        /*em->persist($curriculo);*/ 

        $em->flush(); /*the above line is in comment because I just want to update*/

                            /*At this point the entity should be updated, but it's not*/

        /*Llamando a la plantilla de listados*/
        $curriculos = $em->getRepository('SofLaSoflaBundle:Curriculittle')->findAll();

        /*Enviando los datos a la plantilla y Renderizandola*/
        return $this->render('SofLaSoflaBundle:Default:listado.html.twig', array('curriculos' => $curriculos));
     }
  }

  $em = $this->getDoctrine()->getEntityManager();
  $trabajador=$em->getRepository('SofLaSoflaBundle:Curriculittle')->find($id);
  return $this->render('SofLaSoflaBundle:Default:curriculo.html.twig', array('form' => $form->createView(), 'curriculo' => $trabajador));
}

因此,需要这方面的帮助吗

在您的示例中,您正在创建一个新实体,首先:

$curriculo = new Curriculittle();
由于这不是预先存在的实体(例如,通过数据库查询检索到的实体),因此调用
$em->persist($courloo)
,然后调用
$em->flush()
将此实体另存为新项。由于实体是新的,因此无需更新

用于持久化和刷新的相同代码可用于更新现有实体;您只需要首先检索/获取现有实体,而不是创建一个新实体。目前,您似乎正在接近方法的末尾执行此操作:

$trabajador=$em->getRepository('SofLaSoflaBundle:Curriculittle')->find($id);
但是,您应该在绑定表单之前执行此操作,例如:

public function actualizarCurriculoAction($id) {

  $em = $this->getDoctrine()->getEntityManager();
  $curriculo = $em->getRepository('SofLaSoflaBundle:Curriculittle')->find($id);
  if (!$curriculo) {
    $curriculo = new Curriculittle();
  }
  $form = $this->createForm(new CurriculittleType(), $curriculo);
  $request = $this->getRequest();

  if ($request->getMethod() == 'POST') {
     $form->bindRequest($request);

     $lselect=$this->get('request')->request->get('lselect');
     $edad=$this->get('request')->request->get('edad');
     $estado=$this->get('request')->request->get('estadoselect'); 

     if ($form->isValid()) {
        $curriculo->setUsalentes($lselect);
        $curriculo->setEdad($edad);
        $curriculo->setEstado($estado);    

        $em->persist($curriculo);
        $em->flush();

        /*Llamando a la plantilla de listados*/
        $curriculos = $em->getRepository('SofLaSoflaBundle:Curriculittle')->findAll();

        /*Enviando los datos a la plantilla y Renderizandola*/
        return $this->render('SofLaSoflaBundle:Default:listado.html.twig', array('curriculos' => $curriculos));
     }
  }

  return $this->render('SofLaSoflaBundle:Default:curriculo.html.twig', array('form' => $form->createView(), 'curriculo' => $curriculo));
}

此示例(调整以适应)将首先查找实体,然后将表单提交绑定到该实体。如果实体存在,将对其进行更新。否则,它将另存为新实体。

在您的示例中,您将创建一个新实体,以开始:

$curriculo = new Curriculittle();
由于这不是预先存在的实体(例如,通过数据库查询检索到的实体),因此调用
$em->persist($courloo)
,然后调用
$em->flush()
将此实体另存为新项。由于实体是新的,因此无需更新

用于持久化和刷新的相同代码可用于更新现有实体;您只需要首先检索/获取现有实体,而不是创建一个新实体。目前,您似乎正在接近方法的末尾执行此操作:

$trabajador=$em->getRepository('SofLaSoflaBundle:Curriculittle')->find($id);
但是,您应该在绑定表单之前执行此操作,例如:

public function actualizarCurriculoAction($id) {

  $em = $this->getDoctrine()->getEntityManager();
  $curriculo = $em->getRepository('SofLaSoflaBundle:Curriculittle')->find($id);
  if (!$curriculo) {
    $curriculo = new Curriculittle();
  }
  $form = $this->createForm(new CurriculittleType(), $curriculo);
  $request = $this->getRequest();

  if ($request->getMethod() == 'POST') {
     $form->bindRequest($request);

     $lselect=$this->get('request')->request->get('lselect');
     $edad=$this->get('request')->request->get('edad');
     $estado=$this->get('request')->request->get('estadoselect'); 

     if ($form->isValid()) {
        $curriculo->setUsalentes($lselect);
        $curriculo->setEdad($edad);
        $curriculo->setEstado($estado);    

        $em->persist($curriculo);
        $em->flush();

        /*Llamando a la plantilla de listados*/
        $curriculos = $em->getRepository('SofLaSoflaBundle:Curriculittle')->findAll();

        /*Enviando los datos a la plantilla y Renderizandola*/
        return $this->render('SofLaSoflaBundle:Default:listado.html.twig', array('curriculos' => $curriculos));
     }
  }

  return $this->render('SofLaSoflaBundle:Default:curriculo.html.twig', array('form' => $form->createView(), 'curriculo' => $curriculo));
}

此示例(调整以适应)将首先查找实体,然后将表单提交绑定到该实体。如果实体存在,将对其进行更新。如果没有,它将另存为一个新实体。

自Symfony2.3以来,您应该使用
HandlerRequest
而不是
bindRequest
自Symfony2.3以来,您应该使用
HandlerRequest
而不是
bindRequest