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