使用Doctrine2创建新条目而不是更新旧条目

时间:2011-11-19 00:37:36

标签: php symfony doctrine-orm entitymanager

现在我正在将Doctrine2与Symfony2结合使用。我有一个名为“OrderRequest”的实体,它包含两个对另一个名为“OrderRequestPerson”的条目类型的引用(这些是orderer和receiver字段)。在我的表单中,用户可以选择设置orderer = receiver或填写接收者信息。

我在这个特定情况下有一个错误:订单放在orderer = receiver的位置,因此在数据库中orderer和receiver字段具有相同的值(在这种情况下为15,指的是OrderRequestPerson id)。如果管理员去了并将订单更新到订货人!=接收者的位置,我需要更新接收者字段。目前,实体管理器将更新ID为15的OrderRequestPerson,从而更新订货人和接收者。有没有办法告诉Doctrine2 / Symfony2为接收者创建一个新条目,使用新的id并将信息放入该条目而不是更新orderer信息?

我的代码发布在下面:

    //  Get the entity manager.
    $em = $this->getDoctrine()->getEntityManager();

    //  Grab the order.
    $order = $em->getRepository('OrderRequestBundle:OrderRequest')
                ->getOrder($id);

    //  Get important information.
    $request = $this->getRequest();

    //  Create the OrderRequest form.
    $form = $this->get('form.factory')->create(new OrderRequestType(), $order);

    //  Fill the form with the request information.
    $form->bindRequest($request);

    //  Save the information.
    $em->flush();

1 个答案:

答案 0 :(得分:1)

您基本上必须将实体与实体管理器分离,然后再次将其保留,这将强制将其作为新实体插入。

$person = $order->getReceiver();
$em->detach($person);
$em->persist($person);
$order->setReceiver($person);

现在的问题是,如果表单要单独修改一个或另一个,你应该这样做。

我猜你总是可以在绑定表单之前完成它,然后如果你看到接收器和orderer都包含相同的数据,你就丢弃接收器(不要忘记删除或至少将它从{{{ 1}}),并再次将orderer设置为接收器。

我希望这是有道理的。但要小心,否则你最终会在db中找到大量的重复数据和孤立数据。

您可以在detach in the doctrine docs上阅读更多内容。