Forms 以Symfony4形式将实体对象值传入嵌套的CollectionTypes

Forms 以Symfony4形式将实体对象值传入嵌套的CollectionTypes,forms,e-commerce,symfony4,many-to-one,Forms,E Commerce,Symfony4,Many To One,概述:在产品中的每个变量组变量集我需要创建一个包含变量组变量的下拉列表,格式为Symfony 详细信息: 我有一个产品实体,它作为一个多个关系关联到多个变量集对象。VariantSet对象包含多个VariantGroup对象,每个对象都需要生成一个下拉列表来显示其Variant选择 对于嵌套的CollectionTypes,我只需要访问与父CollectionType相关的选项 因此,唯一可用的变体应与变体组相关,后者仅与与最初解析的产品相关的可用变体集相关 有一些信息指向使用查询生成器仅获取相

概述:在
产品中的每个
变量组
变量集
我需要创建一个包含
变量组
变量
的下拉列表,格式为Symfony

详细信息: 我有一个
产品
实体,它作为一个
多个
关系关联到多个
变量集
对象。
VariantSet
对象包含多个
VariantGroup
对象,每个对象都需要生成一个下拉列表来显示其
Variant
选择

对于嵌套的
CollectionTypes
,我只需要访问与父
CollectionType
相关的选项

因此,唯一可用的
变体
应与
变体组
相关,后者仅与与最初解析的
产品
相关的可用
变体集
相关

有一些信息指向使用查询生成器仅获取相关项,但我想知道这是否是最佳实践。另外-我如何传递前面的表单(因此在
VariantGroup
的嵌套
CollectionType
中获取顶级
Product
,因为
VariantSets
位于这两者之间)

在Symfony表单中使用最佳实践是否可以实现这一点


所需输出的示例是。答案是嵌套的
CollectionType
表单和最终表单中的自定义查询生成器(出于某种原因,它调用数据库中的所有
Variant
对象,而不是使用与解析的
VariantGroup
对象关联的对象:

主要产品形式

class ComplexProductType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        // Render the variant sets based on the parsed product
        $builder
            ->add('variantSets', CollectionType::class, [
                'entry_type' => VariantSetComplexProductType::class,
                'label'=> false,
                'by_reference' => true,


            ] );
        ;
    }


    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            "data_class" => Product::class,
        ));
    }

}
呈现产品变量集:(获取与主要产品
变量集
对象关联的正确
变量组

在下拉列表中呈现变量集
variantGroup
及其
Variants

Variant
对象的下拉需要使用
query\u builder
选项在
FromEvent
中完成,否则我会遇到在DB中调用所有
Variant
对象的问题

需要进行检查,以确保基于解析的
VariantGroup
只调用了正确的
Variant
对象

class VariantGroupComplexProductType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        // Render the drop downs based on the Parsed variant group
        $builder
            ->add( 'label' )
            // Rendering of the drop down must be done after the previous form data is available
            ->addEventListener(FormEvents::PRE_SET_DATA, [$this, 'preSetData']);
        ;
    }


    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults( [
            'data_class' => VariantGroup::class,
        ] );
    }

    public function preSetData(FormEvent $event)
    {
        $form = $event->getForm();

        /** @var VariantGroup $child */
        $child = $event->getData();


        $form
            ->add('variants', EntityType::class, array(
                'class' => Variant::class,
                'by_reference' => true,
                'query_builder' => function (EntityRepository $er) use ( $child ) {
                    return $er->createQueryBuilder('u')
                        ->where('u.variant_group = :variant_group')
                        ->setParameter('variant_group', $child )
                        ->orderBy('u.label', 'DESC');
                },
'choice_label' => 'label',
            ));

    }
}

我将使用多个嵌套的
CollectionTypes
,以
EntityType
作为下拉列表。感谢您的否决投票,但反馈为什么这是一个糟糕的问题,或者需要什么来帮助其他人回答此问题,这将真正有助于创建更具体、更合适的问题。。
class VariantGroupComplexProductType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        // Render the drop downs based on the Parsed variant group
        $builder
            ->add( 'label' )
            // Rendering of the drop down must be done after the previous form data is available
            ->addEventListener(FormEvents::PRE_SET_DATA, [$this, 'preSetData']);
        ;
    }


    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults( [
            'data_class' => VariantGroup::class,
        ] );
    }

    public function preSetData(FormEvent $event)
    {
        $form = $event->getForm();

        /** @var VariantGroup $child */
        $child = $event->getData();


        $form
            ->add('variants', EntityType::class, array(
                'class' => Variant::class,
                'by_reference' => true,
                'query_builder' => function (EntityRepository $er) use ( $child ) {
                    return $er->createQueryBuilder('u')
                        ->where('u.variant_group = :variant_group')
                        ->setParameter('variant_group', $child )
                        ->orderBy('u.label', 'DESC');
                },
'choice_label' => 'label',
            ));

    }
}