2017-01-15 6 views
0

反対側のエンティティからのdoctrineの関連付けを更新するより良い方法があるかどうかを知りたいのですが、この場合は多対多の型ですが、別の型でも構いません。 これは私が使用した方法である:doctrineとsymfony 2.7との関連付けをアップデートしました。

$entity = $em->getRepository('MyBundle:MyEntity')->find($id); 

foreach ($entity->getAssociation() as $value) { 
    $entity->removeAssociation($value); 
} 
$editForm = $this->createEditForm($entity); 
$editForm->handleRequest($request); 
if ($editForm->isValid()) { 
     foreach ($entity->getAssociation() as $value) { 
      $entity->addAssociation($value); 
     } 
     $em->flush(); 
} 

私は(そう削除して追加)更新したいbeacauseそれは、良い方法ではないと思う私は自分のフォームで選択するか、選択解除のみ関連ではなく、すべての要素配列の

public function updateCollection(&$newEntity, $newCollection, $oldCollection, $contains, $add, $remove) { 

    foreach ($oldCollection as $value) { 
     $item = call_user_func(array($newCollection, $contains), $value); 
     if(!$item){ 
      call_user_func(array($newEntity, $remove), $value); 
     } 
    } 

    foreach ($newCollection as $value) { 
     $item = call_user_func(array($oldCollection, $contains), $value); 
     if(!$item){ 
      call_user_func(array($newEntity, $add), $value); 
     } 
    } 

} 

をそして、私はこれで、このメソッドを呼び出します:だから私は、更新機能とサービスを作っ

$oldAssociation = clone $entity->getAssociation(); 

    $editForm = $this->createEditForm($entity); 
    $editForm->handleRequest($request); 

    if ($editForm->isValid()) { 

     $this->get('service_update')->updateCollection(
     $entity, 
     $entity->getAssociation(), 
     $oldAssociation, 
     'contains', 
     'addAssociation', 
     'removeAssociation' 
); 

    $em->flush(); 

} 

しかし、私はそれだけで、この方法は、高価な最初のものよりも多くの時間だと思いますが、アソシエーションが変更された場合は、配列から要素を削除して追加します。私はこれを行うための最良の方法は何か、おそらく2つのうちのどれかも知りません。私を正しい方法で連れてきてくれますか? 私の悪い英語をありがとうと申し訳ありません

答えて

0

私は間違った方法でそれをやっていました。なぜ私は前に、私は複数のために、そのソリューションを使用する人々に助言することがわかっていなかった私にはわからない https://knpuniversity.com/screencast/collections/saving-inverse-side-collection

: は私が今までこの記事では関係の逆側を更新するために最善の解決策を見つけましたエンティティタイプ要素の選択

関連する問題