Использовать отношение ManyToOne как множественный выбор в форме Symfony (с доктриной)


Скажем, существует простое соотношение "многие к одному": модель имеет тип волос и цвет глаз:

/**
 * @ORMEntity
 */
class Model
{
    /**
     * @ORMManyToOne(targetEntity="Hair")
     * @ORMJoinColumn(name="hair_id", referencedColumnName="id")
     */
    protected $hair;

    /**
     * @ORMManyToOne(targetEntity="Eyes")
     * @ORMJoinColumn(name="eyes_id", referencedColumnName="id")
     */
    protected $eyes;

Например, волосы могут быть: светлые, каштановые, черные, рыжие;

Глаз: голубой, зеленый, серый, коричневый.

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

class ModelType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('hair', EntityType::class, [
                'class' => 'AppBundle:Hair',
                'choice_label' => 'name',
                'multiple' => true,
            ])
            ->add('eyes', EntityType::class, [
                'class' => 'AppBundle:Eyes',
                'choice_label' => 'name',
                'multiple' => true,
            ])
            ->getForm();
       ;
}

Форма выглядит следующим образом:

форма

Конечно, при выборе нескольких значений и отправке это вызывает Ошибка:

Expected argument of type "AppBundleEntityHair", "DoctrineCommonCollectionsArrayCollection" given

Может быть, это не для использования в таком случае?

Есть ли какие-либо рекомендации по созданию форм поиска в Symfony? Но ничего не нашел...

2 2

2 ответа:

Проблема не в форме, а в вашем отображении.

Я предполагаю, что ваша форма связана с сущностью модели. Вот почему отношение ManyToOne принимает только одну связанную сущность.

Решение :

Не привязывайте форму к объекту модели, просто используйте форму без класса:

Http://symfony.com/doc/current/form/without_class.html

Модель может иметь много цветов волос и много цветов глаз ?

В этом случае вы должны использовать отношение many-to-many вместо many-to-one

Если нет, вы должны удалить 'multiple' => true, в вас ModelType