2017-01-15 9 views
0

Я хочу знать, существует ли это лучший способ обновить ассоциацию в доктрине из объекта с обратной стороной, в этом случае это тип от многих до многих, но он может быть другим. Это метод, который я использовал:Обновить связь с доктриной и 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(); 
} 

Я думаю, что это не очень хороший подход, обусловленно Я хочу обновить (так удалить и добавить) только ассоциацию, что я выбрать или отменить в моей форме, а не каждый элемент массива. Так что я сделал услугу с функцией обновления:

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

} 

Но я думаю, что этот метод более раз дороже, чем первый, но это только удалить и добавить элементы из массива, для которых была изменена ассоциация. Я не знаю, что это лучший способ сделать это, может быть, и не один из них. Можете ли вы привести меня на правильный путь, пожалуйста? Спасибо и извините за мой плохой английский

ответ

0

Я делал это неправильно. я нашел самое лучшее решение, когда-либо обновить инвертированием сторону отношения в этой должности: https://knpuniversity.com/screencast/collections/saving-inverse-side-collection

Я не знаю, почему, но я не нашел, что раньше, я советую людям использовать это решение для нескольких выбор элементов типа сущности.

 Смежные вопросы

  • Нет связанных вопросов^_^