在 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 的表单:
说,有一个简单的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 的表单: