首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony:如何从大集合添加一个子集合到实体类型?

Symfony:如何从大集合添加一个子集合到实体类型?
EN

Stack Overflow用户
提问于 2015-07-19 07:55:29
回答 1查看 1K关注 0票数 0

一台汽车机油适用于几种车型,但在我的情况下,我们系统中有数百种车型,我不想把它们全部加载到一个页面上,然后,让用户选择特定的车型,最好是用ajax调用得到汽车品牌、汽车系列的车型。用户选择项的子集合,将所选的项张贴到服务器。

在表单类型中,我在下面添加了一个表单字段,如我们所知,如果我不将其选项设置为空数组,实体字段将得到所有的car模型,这将导致巨大的性能损失。

代码语言:javascript
复制
->add('applicableModels', 'entity', array(
                        'class' => 'VMSP\CarBundle\Entity\CarModel',
                        'choices'=>array(),
                        'multiple'=>true,
                        'property_path' => "modelName",
                        'label' => 'vmsp_product.product.form.applicable_model',
                    )
          )

那么,如何从一个大集合中添加一组子项,并将这些选定的项分配给实体类型?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-19 10:01:53

简单的答案是,您可以为每个元素定义一个自定义查询生成器,将其添加到表单中,即

代码语言:javascript
复制
$data = $builder->getData();
\\...
->add('applicableModels', 'entity', array(
    'class' => 'VMSP\CarBundle\Entity\CarModel',
    'multiple' => true,
    'property_path' => "modelName",
    'label' => 'vmsp_product.product.form.applicable_model',
    'query_builder' => function (EntityRepository $er) use ($data) {
        $qb = $er->createQueryBuilder('e')
                ->where('e.manufacturer IN (:manufacturer)')
                ->setParameter('manufacturer', $data['manufacturer']);
        return $qb->orderBy('e.name');
    },
))

因此,您可能有一种“向导”,其中用户选择一个制造商,页面重新加载,而显示的汽车只是一个子集。

不过,在类似的情况下,我做的事情有点不同。在表单中,选项被设置为空数组。在前端,这些选项是通过Ajax调用单独的API来填充的。然后,在表单“预提交”事件上,我用所选的选项填充字段。

代码语言:javascript
复制
$builder->addEventListener(
        FormEvents::PRE_SUBMIT, function (FormEvent $event) {
        $form = $event->getForm();
        $data = $event->getData();
        if (!empty($data['applicable_model'])) {
            $form->add('applicable_model', 'entity', array(
                'class' => 'VMSP\CarBundle\Entity\CarModel',
                'query_builder' => function (EntityRepository $er) use ($data) {
                    $qb = $er->createQueryBuilder('e')
                        ->where('e.id IN (:applicable_model)')
                        ->setParameter('applicable_model', $data['applicable_model']);
                    return $qb;
                },
            ));
        }

更新:我了解到addEventListener部件可能会被DataTransforme替换,参见https://stackoverflow.com/a/31938905/410761

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31499111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档