My Symfony(3.3)表单EntityType显示为选择输入,并列出我们在数据库中拥有的所有客户端。客户端实体使用惰性模式与其他几个实体相关联 呈现选择框时,将发出204个DB查询。我怀疑表单组件针对每个查询结果调用setter,导致加载许多其他数据库查询。
我猜可以将关联映射设置为“EAGER”,或者在表单的querybuilder选项中使用join('...') - > addSelect('...')方法来强制数据成为结果的一部分,但是当涉及多个实体时,水化过程仍然很昂贵 正如你所看到的,我试图使用Doctrine Query HINT,希望它可以解决问题,但它没有改变任何东西。
那么,这种用例的方法是什么? 我应该怎么做才能获得填充下拉输入所需的字段?
这是我到目前为止所尝试的内容:
$builder->add('parent', EntityType::class, [
'class' => Client::class,
,'required' => false
,'multiple' => false
,'query_builder' => function (EntityRepository $er) {
$qb = $er ->createQueryBuilder('c')
// All I want doctrine to fetch are the following fields
->select('PARTIAL c.{id,uuid,name,shortName}');
// I expected this flag to help but it does not change the total amount of queries executed
$qb->getQuery()->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true);
return $qb;
}
])…
谢谢。
答案 0 :(得分:0)
解决
其中一个关联是oneToOne,是唯一一个具有映射" fetch"密钥设置为' EAGER '。
我希望Doctrine在使用默认的EntityType的QueryBuilder时自动加入并选择这样的关联,但它没有,我必须明确地告诉querybuilder这样做(再次,尽管fetch标志设置为&#39 ; EAGER'。)
return $qb->select('c, p')->leftJoin('c.param', 'p');
我真的不知道下面发生了什么,仍然将数据库请求的数量减少到4个查询。