2017-07-28 104 views
0

我的Symfony(3.3)表单EntityType显示为选择输入并列出了我们在数据库中拥有的所有客户端。客户端实体与使用懒惰模式的其他几个实体关联。
当选择框被渲染时,发出204个数据库查询。我怀疑表单组件根据每个查询结果调用setter,导致加载许多额外的数据库查询。我们可以将关联映射设置为“EAGER”,或者在窗体的querybuilder选项中使用join('...') - > addSelect('...')方法强制数据成为结果的一部分,但当涉及多个实体时,水合过程仍然昂贵。你可以看到,我试图使用Doctrine Query HINT,希望它能解决问题,但它没有改变任何东西。Symfony - 在EntityType查询生成器的水合过程中丢弃关联字段

那么,这样的用例有什么办法呢?
我应该怎么做才能得到我需要填充下拉输入的字段?

这里是我试过到目前为止:

$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

解决

一个关联的是一个oneToOne并且是有其映射的仅一个“获取”键设置为“EAGER”。
我希望Doctrine在使用默认的EntityType的QueryBuilder时自动加入并选择这种关联,但是它并没有,我不得不明确告诉querybuilder这样做(尽管fetch标志设置为'EAGER')。

return $qb->select('c, p')->leftJoin('c.param', 'p'); 

我真的不明白了这里发生了什么底下怎么回事,还是数据库的请求数量降至下来回4个查询。