我正在构建一个包含相当多嵌套对象的网站。随着数据库变得越来越大,教条协会开始真正展现出来的过程非常缓慢但肯定。我遇到的最重要的问题之一是我需要创建下拉列表,以便用户可以关联其中一些实体。下面的代码是我用于生成表单的FormType之一的一部分。
$builder
->add('sidebarcontent')
->add('publicAgenda')
->add('assets')
->add('structure')
->add('history')
->add('emblem')
->add('demonym')
->add('type', EntityType::Class, array(
'class' => 'ContentBundle\Entity\OrganizationType',
'choice_label' => 'name',
'empty_data' => '',
'required' => false,
'query_builder' =>function (EntityRepository $er) use ( $world ) {
return $er->createQueryBuilder('c')
->orderBy('c.name', 'ASC');
}))
->add('geographicLocation', EntityType::Class, array(
'class' => 'ContentBundle\Entity\Location',
'choice_label' => 'title',
'empty_data' => '',
'required' => false,
'query_builder' =>function (EntityRepository $er) use ( $world ) {
return $er->createQueryBuilder('c')
->where('c.world = ?1')
->setParameter(1, $world)
->andWhere('c.state != ?2')
->setParameter(2, 'archived')
->orderBy('c.title', 'ASC');
}
))
->add('parent', EntityType::Class, array(
'class' => 'ContentBundle\Entity\Organization',
'choice_label' => 'title',
'empty_data' => '',
'required' => false,
'query_builder' =>function (EntityRepository $er) use ( $world ) {
return $er->createQueryBuilder('c')
->where('c.world = ?1')
->setParameter(1, $world)
->andWhere('c.state != ?2')
->setParameter(2, 'archived')
->orderBy('c.title', 'ASC');
}
))
->add('ethnicities', EntityType::Class, array(
'class' => 'ContentBundle\Entity\Ethnicity',
'choice_label' => 'title',
'empty_data' => '',
'multiple' => true,
'expanded' => true,
'required' => false,
'query_builder' =>function (EntityRepository $er) use ( $world ) {
return $er->createQueryBuilder('c')
->where('c.world = ?1')
->setParameter(1, $world)
->andWhere('c.state != ?2')
->setParameter(2, 'archived')
->orderBy('c.title', 'ASC');
}
));
有没有办法将这些实体提取到最低限度(uuid,title)而不是水合它们?我甚至不确定这是否是正确的问题。我只是想减少我现在的加载时间。
答案 0 :(得分:0)
EntityType表单字段必需的实体对象,您不能只选择必填字段,否则,它不会知道实体关系中要保留的内容。
如果您确实只需要提取某些字段,则必须使用ChoiceType字段。但请记住,在持久化实体时,需要为相关实体提供对象。
作为另一种选择,您还可以尝试将choices参数与发现的学说查询结果一起使用,这样就可以缓存查询和/或查询结果。
例如: 将query_builder参数替换为表单中的choices参数。
$choices = $this->createQueryBuilder('c')
->where('c.world = ?1')
->setParameter(1, $world)
->andWhere('c.state != ?2')
->setParameter(2, 'archived')
->orderBy('c.title', 'ASC');
->getQuery()
->useQueryCache(true)
->useResultCache(true, 3600) // this will cache most common results for a while.
->execute();
然后该字段如下。
->add('geographicLocation', EntityType::Class, array(
'class' => 'ContentBundle\Entity\Location',
'choice_label' => 'title',
'empty_data' => '',
'required' => false,
'choices' => $choices
))