Symfony 2.3使用选择或其他类型将自定义数据传递给实体表单

时间:2014-04-01 16:20:26

标签: entity-framework symfony doctrine-orm doctrine formbuilder

SETUP:

  • 具有ManyToOne关系的相关实体的主要实体。
  • 主要实体具有添加了相关实体的formType。
  • 相关实体是一个包含大量字段和相关对象的大对象,而且速度很慢。
public function buildForm(FormBuilderInterface $builder, array $options)
{
  $builder
      ->add('relatedEntity', 'entity', array(
          'class' => 'ProjectName\RelatedEntityBundle\Entity\RelatedEntity',
          'query_builder' => function (EntityRepository $er) {
                  $queryBuilder = $er->createQueryBuilder('relatedEntity');
                  $queryBuilder->resetDQLPart('select');
                  $queryBuilder->resetDQLPart('from');
                  $queryBuilder->select('relatedEntity')
                      ->distinct(true)
                      ->from('ProjectNameRelatedEntityBundle:RelatedEntity', 'relatedEntity');
                  return $queryBuilder;
              },
       ....
       ....
}


模板:
(relatedEntity定义了__toString()函数来显示其名称。)

{{ form_label(form.relatedEntity) }}
{{ form_widget(form.relatedEntity) }}
{{ form_errors(form.relatedEntity) }}


问题:

  1. 如上所示的Main实体将获取所有对象并传递它们 到模板。它工作得很好但是因为它很慢 相关实体对象很大,查询可能需要10多个 完成所有对象数据保湿的秒数。
  2. 如何从相关实体中仅选择一些字段并在模板中显示这些字段而不会让所有对象都保持水分?
  3. 是否可以使用选项或其他类型而不是 默认的entity类型只能获取相关的某些字段 实体并在模板中显示它们?
  4. 我如何构建一个自定义查询作为一个简单的键值数组,并将该数组传递给我的相关实体字段的queryBuilder?
  5. 最后,如果不可能只获得某些字段 在模板中显示,我应该避免使用symfony 2表格并制作一个 相关实体的定制管理?


  6. 测试:
    我似乎无法通过传递一个数组来构建带有choice type的表单,以显示一个带有模板中相关实体的id和名称的selectBox。我总是得到同样的错误,要求我在该choiceS选项中插入一个实体对象数组。

    让我们看一下主实体的formType,buildForm函数的一些例子:

    • WORKS ,默认Symfony 2生成的代码为null类型:
      

    - >添加(' relatedEntity',null,数组('标签' =>' relatedEntity')


    • 工作,与'实体'类型和一个简单的queryBuilder:
    ->add('relatedEntity', 'entity', array(
      'class' => 'ProjectName\RelatedEntityBundle\Entity\RelatedEntity',
      'query_builder' => function (EntityRepository $er) {
              $queryBuilder = $er->createQueryBuilder('relatedEntity');
              $queryBuilder->resetDQLPart('select');
              $queryBuilder->resetDQLPart('from');
              $queryBuilder->select('relatedEntity')
                  ->from('ProjectNameRelatedEntityBundle:RelatedEntity', 'relatedEntity');
              return $queryBuilder;
          },
      'property' => 'descripcion'
    ))
    


    • DOESNT WORK 与' choice'类型,选择'传递值数组的选项:
      

    $ arrayValues = array(' 1' =>' name1',' 2' =>' name2',&# 39; 3' = GT;' NAME3&#39);

        ->add('relatedEntity', 'choice', array(
            'choices' => $arrayValues,
            'multiple' => false,
            'label'=> 'relatedEntity'
        ))
    


    • DOESNT WORK 与' entity'类型,选择'传递值数组的选项:
      

    $ arrayValues = array(' 1' =>' name1',' 2' =>' name2',&# 39; 3' = GT;' NAME3&#39);

        ->add('relatedEntity', 'entity', array(
            'class' => 'ProjectName\RelatedEntityBundle\Entity\RelatedEntity',
            'choices' => $arrayValues ,
            'multiple' => false,
            'label'=> 'relatedEntity'
        ))
    


    我还尝试通过构建我的相关实体的一系列objets来破解选择输入requeriment,但它要求我在发送到选择类型之前保留这些实体。

1 个答案:

答案 0 :(得分:2)

问题是你的表单元素,它要求它的内容是一个实体,它是类ProjectName\RelatedEntityBundle\Entity\RelatedEntity的一个实例,但你传递一个数组作为选择:

$arrayValues = array(
    '1'=>'name1',
    '2'=>'name2',
    '3'=>'name3'
);

另一方面,当您使用choice-element并添加数组时,您的表单元素将返回一个字符串,而您的实体需要relatedEntity作为上述类的实例。

无论哪种方式,您都必须确保从元素添加或检索的数据符合您的要求。

你可以做的是,使它成为choice - 元素并删除类限制(正如你所尝试的那样)。然后,为了确保它将返回实体实例而不是字符串,您可以使用Form Events。您可以使用FormEvents::SUBMITFormEvents::PRE_SUBMIT来检查选择了哪个实体名称,并执行查询以获取相应的实体,例如类似的东西:

$objectRepository->findEntityBy(array('name' => $name));