Symfony - 在EntityType查询构建器的水合过程中丢弃关联字段

时间:2017-07-28 14:45:56

标签: symfony doctrine-orm doctrine-query symfony-3.3

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;
        }
    ])…

谢谢。

1 个答案:

答案 0 :(得分:0)

解决

其中一个关联是oneToOne,是唯一一个具有映射" fetch"密钥设置为' EAGER '。
我希望Doctrine在使用默认的EntityType的QueryBuilder时自动加入并选择这样的关联,但它没有,我必须明确地告诉querybuilder这样做(再次,尽管fetch标志设置为&#39 ; EAGER'。)

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

我真的不知道下面发生了什么,仍然将数据库请求的数量减少到4个查询。