Отношение много ко многим, но не отображается - PullRequest
1 голос
/ 01 октября 2019

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

Entity Car.php:


private $id;
private $label;
/**
 * @ORM\ManyToMany(targetEntity="App\Entity\User", inversedBy="cars")
 */
private $user;

Пользователь Entity:

private $id;
private $name;
private $roles = [];
/**
 * @ORM\ManyToMany(targetEntity="App\Entity\Car", mappedBy="user")
 */
private $cars;

Form \ CarType.php:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
         ->add('user', EntityType::class, [
                'class' => User::class,
                'multiple'     => true,
                'query_builder' => function (EntityRepository $repo) {
                    return $repo->createQueryBuilder('u')
                        ->where('u.roles like :role')
                        ->setParameter('role', '%"'.'ROLE_EXPERT'.'"%');
                },
                'choice_label' => function ($user) {
                    return $user->getUsernameFormated();
                },
                'required' => true,

            ])
        ->add('role2', EntityType::class, [
                'class' => User::class,
                'query_builder' => function (EntityRepository $repo) {
                    return $repo->createQueryBuilder('u')
                        ->where('u.roles like :role')
                        ->setParameter('role', '%"'.'ROLE_2'.'"%');
                },
                'mapped' => false,
                'multiple' => false,
                'required' => false,
                'choice_label' => function ($user) {
                    return $user->getUsernameFormated();
                },
                'placeholder' => 'Choisir une option',
                'label' => 'role2'
    ])

CarController.php

 $role2= $form->get('role2')->getData();
 if($role2) $car->addUser($role2);

Первое поле (role1) ведет себя, как и ожидалось, при выборе значений ужев базе данных (потому что mutliple = true?).

С другой стороны, для role2 значение, уже находящееся в базе, не выбрано по умолчанию.

Когда я отображаю форму, выбранное значение является заполнителем (потому что множественный = ложь?) Я хочу оставить множественным = ложное для роли 2.

Цель добавить пользователя1 с ролью1 (первое поле) и user2 с role2 в Entity User.

Как я могу это сделать?

EDIT: в соответствии с предложением Arleigh Hix, я пытаюсь использовать CollectionType. Но чтобы иметь возможность фильтровать пользователей по ролям (чтобы в форме было 2 пользовательских поля), я безуспешно пытаюсь с formEvent

Form \ CarType.php:

 ->add('user', CollectionType::class, [
                'entry_type' => UsersByRoleType::class,

  ])

Form \ UsersByRoleType.php

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event)  {
            $form = $event->getForm();

            $formOptions = [
                'class' => User::class,
                'multiple' => true,
                'query_builder' => function (UserRepository $userRepository)  {

                        return $userRepository->createQueryBuilder('u')
                            ->where('u.roles like :role')
                            ->setParameter('role', '%"'.'ROLE_EXPERT'.'"%');
                    },
                'choice_label' => 'email',
                'required' => true,
                'label' => 'label.role'
            ];

            $form->add('cars', EntityType::class, $formOptions);
...