gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:50:55 25 4
gpt4 key购买 nike

设置:

  • 具有多对一关系的相关实体的主要实体。
  • 主实体有一个添加了相关实体的 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;
},
....
....
}


模板:
(relateEntity 定义了一个 __toString() 函数来显示它的名字)。

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


问题:

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



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

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

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

->add('relatedEntity', null, array('label'=> 'relatedEntity'))


  • WORKS,具有“实体”类型和一个简单的 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'
))


  • 不工作“选择”类型,“选择”选项传递值数组:

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

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


  • 不工作“实体”类型,“选择”选项传递值数组:

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

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


我还测试了尝试通过构建相关实体的对象数组来破解选择输入要求,但它要求我在将这些实体发送到选择类型之前保留这些实体。

最佳答案

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

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

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

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

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

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

关于entity-framework - Symfony 2.3 使用选择或其他类型将自定义数据传递给实体表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22791420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com