【问题标题】:Symfony: how to add a sub set of items from big collection to entity type?Symfony:如何将大集合中的项目子集添加到实体类型?
【发布时间】:2015-10-08 13:11:14
【问题描述】:

一种车机油适用于多种车型,但就我而言,我们系统中有数百种车型,我不想将它们全部加载到一个页面中,然后,让用户选择特定的汽车型号,最好使用ajax调用按汽车品牌,汽车系列获取汽车型号。用户选择项目的子集合,将这些选择的项目发布到服务器。

在表单类型中,我添加了一个如下所示的表单字段,众所周知,如果我不将其选项选项设置为空数组,实体字段将获取所有车型,这将导致巨大的性能损失.

->add('applicableModels', 'entity', array(
                        'class' => 'VMSP\CarBundle\Entity\CarModel',
                        'choices'=>array(),
                        'multiple'=>true,
                        'property_path' => "modelName",
                        'label' => 'vmsp_product.product.form.applicable_model',
                    )
          )

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

【问题讨论】:

    标签: symfony


    【解决方案1】:

    简单的答案是您可以为每个元素定义一个自定义查询构建器,然后添加到表单中,即

    $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');
        },
    ))
    

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

    不过,在非常相似的情况下,我最终做的事情略有不同。在表单中,选项设置为空数组。在前端,这些选项是通过调用一个单独的 API 的 Ajax 填充的。然后在表单“预提交”事件中,我用所选选项填写该字段。

    $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

    【讨论】:

    • 非常好,这就是我要找的,谢谢,Francesco。
    • @videni 很高兴听到这个消息!
    • 我刚刚注意到您的更新,我检查了该帖子,但我不明白为什么将字段类型从实体更改为文本时它会起作用,因为我们需要的是一个集合,而是一个项目。请问你有什么想法吗?
    猜你喜欢
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多