0

我的 Symfony (3.3) Form 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;
        }
    ])…

谢谢你。

4

1 回答 1

0

解决了

其中一个关联是 oneToOne,并且是唯一一个将其映射“获取”键设置为“ EAGER ”的关联。
我希望 Doctrine 在使用默认 EntityType 的 QueryBuilder 时自动加入并选择这样的关联,但事实并非如此,我不得不明确告诉查询构建器这样做(再一次,尽管 fetch 标志设置为“EAGER”)。

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

我真的不明白下面发生了什么,但数据库请求的数量仍然下降到 4 个查询。

于 2017-07-31T14:05:39.987 回答