使用一个表单修改多个实体(批量修改)

时间:2018-06-13 12:40:45

标签: forms symfony bulkupdate

我希望能够提交修改多个实体的表单。我们说我已经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会创建多个子表单而不是多个表单,因此在这种情况下,它不会产生很大的差异。

0 个答案:

没有答案