我想知道是否存在更好的方法来更新来自相反方实体的学说中的关联,在这种情况下,它是多对多类型,但也可能是另一种类型。
这是我使用的方法:
$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();
}
但我认为这种方法比第一种方法更耗时,但它仅从关联已更改的数组中删除和添加元素。我不知道最好的方法是什么,也许两者都不是。你能带我走正确的路吗? 谢谢你,抱歉我的英语不好
我的做法是错误的。 我在这篇文章中找到了更新关系反面的最佳解决方案: https://knpuniversity.com/screencast/collections/ saving-inverse-side-collection
我不知道为什么,但我之前没有发现这一点,我建议人们使用该解决方案来进行实体类型元素的多种选择。