Symfony2:多对多的两个拥有者?

时间:2014-05-23 14:01:53

标签: symfony doctrine-orm symfony-forms

假设我有一个Person实体和一个ResearchArea实体。它们之间存在ManyToMany Doctrine关系,只有简单的连接表,Person可以有多个ResearchAreaResearchArea可以有多个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。

我是不是觉得这太复杂了?有解决方案吗?

2 个答案:

答案 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名研究人员不是什么大问题。