загрузка нескольких файлов в symfony 4

Я пытаюсь загрузить больше, чем изображение в базу данных. но мой код загружает только последний выбранный. вот код:

/**
     * @Route("/property/add-media/{id}", name="addPhotoProperty")
     * @Method({"GET", "POST"})
     */
    public function addPhotoToProperty(Request $request, $id){
        $property = $this->getDoctrine()->getRepository(Property::class)->find($id);
        $media = new Media();

        $mediaForm = $this->createFormBuilder($media)
            ->add('pathtofile', FileType::class, array(
                'mapped' => false,
                'multiple' => true,
            ))
            ->add('isvideo', ChoiceType::class, [
                'choices' => [
                    'Video' => '1',
                    'Photo' => '0'
                ],
                'multiple' => false,
                'expanded' => true
            ])
            ->add('upload', SubmitType::class)
            ->getForm();

        $media->setProperty($property);
        $mediaForm->handleRequest($request);

        if ($mediaForm->isSubmitted() && $mediaForm->isValid()){
            $files = $mediaForm->get('pathtofile')->getData();
            //dd($files);

            foreach ($files as $file)
                {
                    $filename = md5(uniqid()).'.'.$file->guessExtension();
                    $file->move($this->getParameter('uploads'), $filename);
                    $media->setPathToFile($filename);
                    //dd($media);
                    $em = $this->getDoctrine()->getManager();
                    $em->persist($media);
                    $em->flush();
                }
        }

        return $this->render('Property/addPhotoProperty.html.twig', [
            'media' => $mediaForm->createView()
        ]);
    }

как вы можете видеть, я вызываю объект из сущности класса. в этом случае форма загрузчика файлов принимает несколько файлов или изображений.


person mike    schedule 31.01.2019    source источник


Ответы (1)


Ваша проблема в вашей петле. Вы используете ту же сущность Media и меняете только свойство PathToFile. Сначала $em->flush(); вы создаете новую запись, но, поскольку это тот же объект (он же не новый), Doctrine выполняет обновление.

foreach ($files as $file)
{
    $filename = md5(uniqid()).'.'.$file->guessExtension();
    $file->move($this->getParameter('uploads'), $filename);
    $media->setPathToFile($filename); // Same entity, that is being updated

    $em = $this->getDoctrine()->getManager();
    $em->persist($media);
    $em->flush();
}

Я предлагаю вам создать новый в вашем цикле. В примере:

$em = $this->getDoctrine()->getManager(); // You don't need to slow down your code and request the same entity manager on each iteration
foreach ($files as $file)
{
    $filename = md5(uniqid()).'.'.$file->guessExtension();
    $file->move($this->getParameter('uploads'), $filename);

    $NewMedia = new Media();             // new entity, that is being created
    $NewMedia->setProperty($property);
    $NewMedia->setPathToFile($filename);

    $em->persist($NewMedia);
}
$em->flush(); //Flush outside of the loop, Doctrine will perform all queries
person Cid    schedule 31.01.2019