Symfony 3.4:关于将对象数组集合保存到OneToMany的问题

Symfony 3.4:关于将对象数组集合保存到OneToMany的问题,symfony,arraycollection,Symfony,Arraycollection,我需要你们帮助解决我在表中保存数据的问题。 我使用fosUserBundle,有不同的用户类型Admin、Pro和Client,它们是扩展基本用户实体的类。 我还有一个语言实体,它通过一对多关联链接到用户。 要订阅,用户客户端需要通过复选框检查他所说的语言 表单页面正常,它显示UserClient表单+父用户表单,并将语言列表作为复选框 问题在于表中保存的数据。 我在“语言”列中有相同的值: 这是我的密码: User.php use Doctrine\Common\Collections

我需要你们帮助解决我在表中保存数据的问题。 我使用fosUserBundle,有不同的用户类型Admin、Pro和Client,它们是扩展基本用户实体的类。 我还有一个语言实体,它通过一对多关联链接到用户。 要订阅,用户客户端需要通过复选框检查他所说的语言

表单页面正常,它显示UserClient表单+父用户表单,并将语言列表作为复选框

问题在于表中保存的数据。 我在“语言”列中有相同的值:

这是我的密码:

User.php

    use Doctrine\Common\Collections\ArrayCollection;
    use Symfony\Component\HttpFoundation\File\UploadedFile;
    use UserBundle\Entity\UserAdmin;
    use UserBundle\Entity\UserProfessional;
    use UserBundle\Entity\UserClient;
    use UserBundle\Entity\Adress;

    /**
     * @ORM\Entity
     * @ORM\InheritanceType("JOINED")
     * @ORM\DiscriminatorColumn(name="discr", type="string")
     * @ORM\DiscriminatorMap({"client" = "UserClient", "professional"="UserProfessional", "admin"="UserAdmin"})
     */
    abstract class User extends BaseUser {

        /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;

        /**
         * @ORM\Column(type="string", length=255)
         */
        protected $firstname;

//[...] getters and setters
实体:UserClient.php

<?php

// src/UserBundle/Entity/UserGuest.php

namespace UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
 * @ORM\Entity
 */
class UserClient extends User {

    /**
     * @ORM\Column(type="array")
     * @ORM\OneToMany(targetEntity="LanguagesBundle\Entity\Languages", mappedBy="userClient")
     */
    private $languages;

    public function __construct() {
        parent::__construct();
        $this->languages = new ArrayCollection();
    }

    /**
     * Set languages
     *
     * @param array $languages
     *
     * @return UserClient
     */
    public function setLanguages($languages)
    {
        $this->languages = $languages;

    }

    /**
     * Get languages
     *
     * @return array
     */
    public function getLanguages()
    {
        return $this->languages;
    }

    /**
     * Add language
     *
     * @param \LanguagesBundle\Entity\Languages $language
     *
     * @return UserClient
     */
    public function addLanguage(LanguagesBundle\Entity\Languages $language)
    {
        $this->languages[] = $language;
        return $this;
    }

    /**
     * Remove language
     *
     * @param \LanguagesBundle\Entity\Languages $language
     */
    public function removeLanguage(\LanguagesBundle\Entity\Languages $language)
    {
        $this->languages->removeElement($language);
    }
}
<?php

// src/UserBundle/Form/UserContactFormType.php

namespace UserBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use LanguagesBundle\Services\LanguagesService;
use LanguagesBundle\Entity\Languages ;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Doctrine\ORM\EntityRepository;

class RegistrationClientType extends AbstractType {

    protected $service;

    public function buildForm(FormBuilderInterface $builder, array $options) {

        parent::buildForm($builder, $options);

        $builder
                ->add('languages', EntityType::class, [
                'class' => 'LanguagesBundle:Languages',
                'choice_label' => 'name',
                'query_builder' => function (EntityRepository $er) {
        return $er->createQueryBuilder('u')
            ->orderBy('u.name', 'ASC');
    },
                'label'     => 'Langues',
                'expanded'  => true,
                'multiple'  => true,
            ])                 
                ;
    }

    public function getParent() {
        // on inclut le formulaire de base d'inscription utilisateur
        return 'UserBundle\Form\RegistrationType';
    }

    public function getBlockPrefix() {
        return 'app_user_registration_client';
    }

    // For Symfony 2.x
    public function getName() {
        return $this->getBlockPrefix();
    }

    public function configureOptions(OptionsResolver $resolver) {
        $resolver
                ->setDefaults(array(
            'data_class' => \UserBundle\Entity\UserClient::class,
                ))
                //->setRequired('service_languages');
                ;
    }

}
我需要将语言作为userClient的数组存储在数据库中。
你能帮我吗。

谢谢你重新编辑我的问题Philip-B- 谢谢你的阅读

我已通过添加foreach将对象转换为数组来解决问题: 代码在我的控制器中:

if ($form->isValid()) {
                $event = new FormEvent($form, $request);
                $dispatcher->dispatch(FOSUserEvents::REGISTRATION_SUCCESS, $event);

                foreach ($user->getLanguages() as $value) {
                    $langue[] = $value->getShortSlug();
                }
                $user->setLanguages($langue);
                $userManager->updateUser($user);

                if (null === $response = $event->getResponse()) {
                    $url = $this->generateUrl('fos_user_registration_confirmed');
                    $response = new RedirectResponse($url);
                }

                $dispatcher->dispatch(FOSUserEvents::REGISTRATION_COMPLETED, new FilterUserResponseEvent($user, $request, $response));

                return $response;
            }
<?php

// src/UserBundle/Form/UserContactFormType.php

namespace UserBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use LanguagesBundle\Services\LanguagesService;
use LanguagesBundle\Entity\Languages ;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Doctrine\ORM\EntityRepository;

class RegistrationClientType extends AbstractType {

    protected $service;

    public function buildForm(FormBuilderInterface $builder, array $options) {

        parent::buildForm($builder, $options);

        $builder
                ->add('languages', EntityType::class, [
                'class' => 'LanguagesBundle:Languages',
                'choice_label' => 'name',
                'query_builder' => function (EntityRepository $er) {
        return $er->createQueryBuilder('u')
            ->orderBy('u.name', 'ASC');
    },
                'label'     => 'Langues',
                'expanded'  => true,
                'multiple'  => true,
            ])                 
                ;
    }

    public function getParent() {
        // on inclut le formulaire de base d'inscription utilisateur
        return 'UserBundle\Form\RegistrationType';
    }

    public function getBlockPrefix() {
        return 'app_user_registration_client';
    }

    // For Symfony 2.x
    public function getName() {
        return $this->getBlockPrefix();
    }

    public function configureOptions(OptionsResolver $resolver) {
        $resolver
                ->setDefaults(array(
            'data_class' => \UserBundle\Entity\UserClient::class,
                ))
                //->setRequired('service_languages');
                ;
    }

}
public function registerClientAction(Request $request) {
        /** @var $formFactory FactoryInterface */
        //$formFactory = $this->get('fos_user.registration_pro.form.factory');
        /** @var $userManager UserManagerInterface */
        $userManager = $this->get('fos_user.user_manager');
        /** @var $dispatcher EventDispatcherInterface */
        $dispatcher = $this->get('event_dispatcher');

        $user = new UserClient();

        $event = new GetResponseUserEvent($user, $request);
        $dispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, $event);

        if (null !== $event->getResponse()) {
            return $event->getResponse();
        }

        $form = $this->createForm(RegistrationClientType::class, $user);

        $form->setData($user);
        $form->handleRequest($request);
        if ($form->isSubmitted()) {
            if ($form->isValid()) {
                $event = new FormEvent($form, $request);
                $dispatcher->dispatch(FOSUserEvents::REGISTRATION_SUCCESS, $event);

                $userManager->updateUser($user);

                if (null === $response = $event->getResponse()) {
                    $url = $this->generateUrl('fos_user_registration_confirmed');
                    $response = new RedirectResponse($url);
                }

                $dispatcher->dispatch(FOSUserEvents::REGISTRATION_COMPLETED, new FilterUserResponseEvent($user, $request, $response));

                return $response;
            }

            $event = new FormEvent($form, $request);
            $dispatcher->dispatch(FOSUserEvents::REGISTRATION_FAILURE, $event);

            if (null !== $response = $event->getResponse()) {
                return $response;
            }
        }

        return $this->render('UserBundle\Registration\register_client.html.twig', array(
                    'form' => $form->createView(),
        ));
    }
if ($form->isValid()) {
                $event = new FormEvent($form, $request);
                $dispatcher->dispatch(FOSUserEvents::REGISTRATION_SUCCESS, $event);

                foreach ($user->getLanguages() as $value) {
                    $langue[] = $value->getShortSlug();
                }
                $user->setLanguages($langue);
                $userManager->updateUser($user);

                if (null === $response = $event->getResponse()) {
                    $url = $this->generateUrl('fos_user_registration_confirmed');
                    $response = new RedirectResponse($url);
                }

                $dispatcher->dispatch(FOSUserEvents::REGISTRATION_COMPLETED, new FilterUserResponseEvent($user, $request, $response));

                return $response;
            }