2011-11-19 205 views
0

現在我正在使用Doctrine2和Symfony2一起使用。我有一個名爲「OrderRequest」的實體,其中包含兩個對名爲「OrderRequestPerson」的其他條目類型的引用(這些是訂購者和接收者字段)。在我的表格中,用戶可以選擇設置orderer = receiver或填寫接收者信息。創建新條目而不是使用Doctrine2更新舊條目

我在這個特定的情況下有一個錯誤:一個訂單放在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(); 
+0

嗯。這可能意味着在綁定任何東西之前,您必須克隆訂購者並將克隆設置爲接收者。嘗試這樣的事情。 – greg0ire

回答

1

你基本上脫離從實體管理器的實體,然後再堅持它,這將迫使它要插入一個新的。

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

現在的問題是,你應該這樣做,如果表單要獨立修改一個或另一個。

我想你可以在綁定表單前總是這樣做,然後如果你看到接收者和訂閱者都包含相同的數據,那麼你會丟棄接收者(不要忘記刪除或至少將它從$em中分離出來),並再次將訂閱者設置爲接收者。

我希望這是有道理的。小心,否則你會最終在我的數據庫中有大量的重複和孤立的數據。

你可以在detach in the doctrine docs瞭解更多。