【问题标题】:Creating new entry rather than update old entry using Doctrine2使用 Doctrine2 创建新条目而不是更新旧条目
【发布时间】:2012-01-01 17:13:54
【问题描述】:

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

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

我的代码贴在下面:

    //  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();

【问题讨论】:

  • 嗯。这可能意味着在绑定任何东西之前,您必须克隆订购者并将克隆设置为接收者。试试这样的。

标签: php symfony doctrine-orm entitymanager


【解决方案1】:

您基本上必须将实体从实体管理器中分离出来,然后再次持久化,这将迫使它作为新的插入。

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

现在的问题是,只有当表单要独立修改其中一个时,您才应该这样做。

我想你可以在绑定表单之前总是这样做,然后如果你看到接收者和订购者都包含相同的数据,你丢弃接收者(不要忘记将其从@987654323 中删除或至少分离@),并再次将orderer设置为receiver。

我希望这是有道理的。请小心,否则我认为您的数据库中会出现大量重复和孤立的数据。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多