假设我有一个Person
实体和一个ResearchArea
实体。它们之间存在ManyToMany Doctrine关系,只有简单的连接表,Person
可以有多个ResearchArea
,ResearchArea
可以有多个Person
。
在我的数据库中,有数千Person
个,但只有大约10 ResearchArea
秒。
在Person
编辑表单上,我想为每个ResearchArea
提供一个复选框列表。这在表单构建器中很容易:
->add('researchAreas', 'entity', array(
'label' => false,
'class' => 'AcmeDemoBundle:ResearchArea',
'property' => 'title',
'required' => false,
'multiple' => true,
'expanded' => true,
))
提交表单并绑定请求数据时,这很有效,并且很好地处理了ManyToMany。
但是,在编辑ResearchArea
实体时,我还希望提供一种管理与该区域相关联的Person
的方法。但是,我不能使用与上面相同的实体表单类型,因为有很多Person
个实体。
而我想要的是collection
表单类型,用户可以在其中添加/删除Person
个实体。我可以通过为每个“行”渲染文本字段并接受要添加的人的ID来完成此操作。
为了支持这样的方法,我需要将关系从ManyToMany更改为OneToMany - > ManyToOne并使连接表成为自己的实体。但是在这样做的时候,我再也不能使用Person
表单上的漂亮复选框,它只适用于直接的ManyToMany。
我是不是觉得这太复杂了?有解决方案吗?
答案 0 :(得分:0)
对于类似的用例,我只使用了entity field type,呈现为多选(multiple => true,expanded => false)并使用jquery插件进行了改进。这很有效,但我没有成千上万的实体。
->add('persons', 'entity', array(
'label' => false,
'class' => 'AcmeDemoBundle:Person',
'required' => false,
'multiple' => true,
'expanded' => false,
))
我使用了一个jquery插件(如Chosen)来改进多选,并使其更加用户友好。选择后,您只需使用:
$(".chosen-select").chosen();
通过一些自定义css,您可以根据自己的需要设计样式。
答案 1 :(得分:0)
我也会提倡实体方法,但我改用select2(http://ivaynberg.github.io/select2/)。
在Many-to-Many Ajax Forms (Symfony2 Forms)中,我有一些相当详细的实施示例。
Select2可以支持ajax加载和搜索,因此3000名研究人员不是什么大问题。