在 Symfony Form 中使用 ManyToOne 关系作为多项选择(使用 Doctrine)

Use ManyToOne relation as multiple choice in Symfony Form (with Doctrine)

说,有一个简单的many-to-one关系:模型有头发类型和眼睛颜色:

/**
 * @ORM\Entity
 */
class Model
{
    /**
     * @ORM\ManyToOne(targetEntity="Hair")
     * @ORM\JoinColumn(name="hair_id", referencedColumnName="id")
     */
    protected $hair;

    /**
     * @ORM\ManyToOne(targetEntity="Eyes")
     * @ORM\JoinColumn(name="eyes_id", referencedColumnName="id")
     */
    protected $eyes;

例如,头发可以是:金色、棕色、黑色、红色;

眼睛:蓝色、绿色、灰色、棕色。

在搜索表单中,我希望用户能够一次 select 多种发型和眼睛。我使用 '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();
       ;
}

表单呈现如下:

当然,当select输入多个值并提交时会导致错误:

Expected argument of type "AppBundle\Entity\Hair", "Doctrine\Common\Collections\ArrayCollection" given

也许,这不是为了在这种情况下使用?

在 Symfony 中构建搜索表单有什么最佳实践吗?没找到...

模型可以有多种头发颜色和多种眼睛颜色?

在这种情况下,您必须使用 many-to-many 关系而不是 many-to-one

如果没有,你必须删除 'multiple' => true, 在你 ModelType

问题不在于表单,而在于您的映射。

我假设您的表单与模型实体绑定。 这就是 ManyToOne 关系只接受一个相关实体的原因。

解决方案 :

不要将表单绑定到模型实体,只需使用不带 class 的表单:

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