【问题标题】:Symfony - Discard association field during hydration process of an EntityType querybuilderSymfony - 在 EntityType 查询构建器的水合过程中丢弃关联字段
【发布时间】:2017-07-28 14:45:56
【问题描述】:

My Symfony (3.3) Form EntityType 显示为选择输入,并列出了我们在数据库中拥有的所有客户端。客户端实体使用惰性模式与其他几个实体相关联。
呈现选择框时,会发出 204 个 DB 查询。我怀疑表单组件会针对每个查询结果调用设置器,从而导致加载许多额外的数据库查询。

我猜我们可以将关联映射设置为“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;
        }
    ])…

谢谢。

【问题讨论】:

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


    【解决方案1】:

    解决了

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-28
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多