我希望能够提交修改多个实体的表单。我们说我已经BulkeditFormType
更改了“活跃”字样。 (布尔)或'组织' (一次是多个用户的(带有App \ Entity \ Organization的EntityType)字段。
这是我目前的解决方案(半伪代码):
public function bulkedit(Request $request)
{
$form = $this->createForm(BulkeditFormType::class, null, [
//..options
]);
if ($request->isXmlHttpRequest()) {
// fields '_token' and empty values are unset, not shown in this example
$formData = $request->request->get($form->getName());
$entityManager = $this->getDoctrine()->getManager();
$repo = $entityManager->getRepository(App\Entity\User::class);
$entities = $repo->findBy([
'id' => [1,2,3,4,5]
]);
foreach ($entities as $entity) {
$form = $this->createForm(BulkeditFormType::class, $entity, [
//..options
]);
$clearMissing = false;
$form->submit($formData, $clearMissing);
$entityManager->persist($entity);
}
$entityManager->flush();
}
return $this->render('@User/User/bulkedit.html.twig', [
'form' => $form->createView()
]);
}
请注意,我已尝试仅包含我的代码的相关部分,因此请将其视为伪代码,以便了解我当前的实现。
虽然此解决方案有效,但它会为每个实体创建一个Form
对象。编辑100个用户将导致大量内存使用和许多无用的数据库查询。
如何修改我的代码,以便只生成一个可以被所有实体重用的表单?我曾尝试使用$form->setData()
,但我觉得必须有更好的方法。 CollectionType
会创建多个子表单而不是多个表单,因此在这种情况下,它不会产生很大的差异。