Изменить несколько объектов с помощью одной формы (массовое редактирование) - PullRequest
0 голосов
/ 13 июня 2018

Я хочу иметь возможность отправить форму, которая изменяет несколько объектов.Допустим, у меня есть BulkeditFormType для изменения полей 'active' (Boolean) или 'organization' (EntityType with App \ Entity \ Organization) для нескольких пользователей одновременно.

Это мое текущее решение (полупсевдокод):

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 создаст несколько подчиненных форм вместо нескольких форм, поэтому в этом случае это не имеет большого значения.

...