Symfony 2.7:EntityType - 在查询构建器中强制没有结果

Symfony 2.7 : EntityType - force no result in query builder

我没有找到 post 来解决我的问题,希望它不是重复的。

在 Symfony 表单中,我声明了一个 entity 字段。

$form->add($builder->getFormFactory()->createNamed(
    'cert_folder_product_factory',
    new EntityMultipleType(),
    null,
    array(
        'label' => '',
        'mapped' => false,
        'class' => 'ProductsBundle:ProductFactory',
        'empty_value' => '',
        'auto_initialize' => false,
        'required' => false,
        'label_controls' => array('add' => 'Add Product', 'remove' => 'Remove Product'),
    )
)); 

我希望这个字段在开始时有一个空的实体集合,因为该集合基于另一个字段值,所以我不放任何 query_builder 参数声明。

$form->add($builder->getFormFactory()->createNamed(
    'supplier_list',
    'entity',
    null,
    array(
        'mapped' => false,
        'label' => ' ',
        'class' => 'SuppliersBundle:Suppliers',
        'empty_value' => '',
        'auto_initialize' => false,
        'required' => false,
        'data' => $data->getSupplierProduct(),
        'query_builder' => function(\Ella\SuppliersBundle\Repository\SuppliersRepository $er) {
                        return $er->createQueryBuilder('q')->andWhere('q.is_delete = 0')->orderBy('q.name', 'asc');
        })  
    )
);

一旦 supplier_list 字段有值,AJAX 查询检索关联的元素并填充 [=48 的集合=] 字段.

为了在提交时验证表单并按照建议进行验证,我声明了 PRE_SUBMIT EventListener 来填充字段集合并验证我的用户选择的值

$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($builder, $container) {
        $data = $event->getData();
        $form = $event->getForm();

        if (!$data['supplier_list']) {
            return;
        }

        $supplierId = $data['supplier_list'];

        $form->add($builder->getFormFactory()->createNamed(
                'cert_folder_product_factory',
                new EntityMultipleType(),
                null,
                array(
                        'label' => '',
                        'mapped' => false,
                        'class' => 'ProductsBundle:ProductFactory',
                        'empty_value' => '',
                        'auto_initialize' => false,
                        'required' => false,
                        'label_controls' => array('add' => 'Add Product', 'remove' => 'Remove Product'),
                        'query_builder' => function(\Ella\ProductsBundle\Repository\ProductFactoryRepository $er) use ($supplierId) {
                            return $er->getProductBySupplier($supplierId);
                        },
                )
            )
        );
    });

一旦我为 supplier_list 字段和表单提交设置了值,一切正常。但是,正如 Symfony 文档对 query_builder 所解释的那样,query_builder 参数的默认行为是加载所有实体,从而使加载时间非常长。

我的解决方法是强制加载一个任意实体

'query_builder' => function (\Ella\ProductsBundle\Repository\ProductFactoryRepository $er) {
    return $er->createQueryBuilder('q')->setMaxResults(1);
}

但是这个解决方案是完全错误的,有什么正确的方法可以强制实体集合首先加载 0 个实体吗?

非常感谢您的帮助。

仅供参考,简单的做法是将 null 作为 $supplierId 参数的值传递,不会检索任何结果(仅当您在 setParameter() 中传递您的值时才有效您的查询生成器)。

我还添加了一个 formModifier,如 https://symfony.com/doc/2.7/form/dynamic_form_modification.html#form-events-user-data 中所述,以避免在不同的字段中复制/粘贴相同的字段 EventListener

$formModifier = function (FormInterface $form, $supplierId = null, $productFactories = null) {
            $form->add('cert_folder_product_factory', new EntityMultipleType(),
                    array(
                        'label' => '',
                        'mapped' => false,
                        'class' => 'ProductsBundle:ProductFactory',
                        'empty_value' => '',
                        'auto_initialize' => false,
                        'required' => false,
                        'label_controls' => array('add' => 'Add Product', 'remove' => 'Remove Product'),
                        'query_builder' => function(\Ella\ProductsBundle\Repository\ProductFactoryRepository $er) use ($supplierId) {
                                return $er->getProductBySupplier($supplierId);
                        },
                        'data' => (count($productFactories) > 0) ? $productFactories : null,
                    )
            );
        };

在PRE_SET_DATA声明字段

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($formModifier, $builder, $container) {
     $formModifier($form,
            ($data->getSupplierProduct()) ? $data->getSupplierProduct()->getId() : null,
            (count($data->getProductFactory())) ? $data->getProductFactory() : null
    );
}

然后在PRE_SUBMIT中验证表单提交

$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($formModifier) {
        $data = $event->getData();
        $form = $event->getForm();

        $formModifier($form,
                array_key_exists('supplier_list', $data) ? $data['supplier_list'] : null
        );
});