Symfony通过编辑添加新记录

时间:2017-08-26 21:56:19

标签: php forms symfony doctrine-orm doctrine

是否有可能根据现有记录将新记录保存到数据库?

我在网址传递'id'。如果为null,则创建具有预设名称的表单,并在提交新项目后添加到数据库。编辑工作原理相同。

但我的目标是: 1)使用来自数据库的现有数据预填充表单(这就是我在url中传递id以获取现有记录的原因)。 2)将其保存为新记录。

不幸的是我的控制器只是像编辑动作一样工作。已编辑的数据仅更改所选项目 - 不将其另存为新项目。

是否有可能在一个控制器中执行此操作?如何使用数据库中的现有对象填充表单并根据以前的记录保存新记录?

 /**
 * @Route("/form", name="form")
 * @Template("@AppBundle/Resources/views/form.html.twig")
 */
public function formAction(Request $request)
{
    $em = $this->getDoctrine()->getManager();
    $itemRecordId = $request->get('id');

    if($itemRecordId == null){
        $item = new Item();
        $item ->setName('Test');
    } else {
        $item = $this->getDoctrine()
            ->getRepository(Item::class)
            ->find($itemRecordId );
    }

    $form = $this->createForm(ItemType::class, $item );

    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $item = $form->getData();
        $em->persist($item );
        $em->flush();

        return new Response('Item created!');
    }

    return array(
        'form' => $form->createView(),
    );
}

2 个答案:

答案 0 :(得分:1)

在坚持你的Item之前,只需克隆它,这将取消设置id,当你保存它时,它将是一个新对象。

if ($form->isSubmitted() && $form->isValid()) {
    $item = $form->getData();
    $newItem = clone $item;
    $em->persist(newItem);
    $em->flush();

    return new Response('Item created!');
}

另外,我会考虑分离创建和编辑操作。

答案 1 :(得分:0)

我正在使用symfony3.4。该代码对我来说效果很好!只需在editform上编辑表单数据,然后单击“另存为”按钮:

public function editAction(Request $request, Societe $societe) {
    $em = $this->getDoctrine()->getManager();
    $editForm = $this->createForm('AppBundle\Form\SocieteType', $societe);
    $editForm->add('saveas', SubmitType::class, ['label' => "Enregister nouveau", 'attr' => ['class' => 'btn btn-sm btn-success',]]);
   $editForm->handleRequest($request);

   if ($editForm->get('saveas')->isClicked()) {
      $societeNew = clone $societe;
      $em->persist($societeNew);
      $em->flush($societeNew);
      return $this->redirectToRoute('societe_index');
            }

   if ($editForm->isSubmitted() && $editForm->isValid()) {
      $this->getDoctrine()->getManager()->flush();
      return $this->redirectToRoute('societe_index');
   }

   return $this->render('societe/edit.html.twig', array(
                'societe' => $societe,
                'edit_form' => $editForm->createView(),
            ));
}