Symfony - 在 EntityType 查询构建器的水合过程中丢弃关联字段
Symfony - Discard association field during hydration process of an EntityType querybuilder
我的 Symfony (3.3) Form EntityType 显示为 select 输入并列出了我们在数据库中的所有客户端。客户端实体使用惰性模式关联到其他几个实体。
呈现 select 框时,会发出 204 个数据库查询。我怀疑表单组件会针对每个查询结果调用 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;
}
])…
谢谢。
已解决
其中一个关联是 oneToOne,并且是唯一一个将其映射 "fetch" 键设置为“EAGER”的关联。
我希望 Doctrine 在使用默认的 EntityType 的 QueryBuilder 时自动加入和 select 这样的关联,但它没有,我不得不明确告诉 querybuilder 这样做(再一次,尽管 fetch 标志设置为 'EAGER').
return $qb->select('c, p')->leftJoin('c.param', 'p');
我真的不明白下面发生了什么,数据库请求的数量仍然下降到 4 个查询。
我的 Symfony (3.3) Form EntityType 显示为 select 输入并列出了我们在数据库中的所有客户端。客户端实体使用惰性模式关联到其他几个实体。
呈现 select 框时,会发出 204 个数据库查询。我怀疑表单组件会针对每个查询结果调用 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;
}
])…
谢谢。
已解决
其中一个关联是 oneToOne,并且是唯一一个将其映射 "fetch" 键设置为“EAGER”的关联。
我希望 Doctrine 在使用默认的 EntityType 的 QueryBuilder 时自动加入和 select 这样的关联,但它没有,我不得不明确告诉 querybuilder 这样做(再一次,尽管 fetch 标志设置为 'EAGER').
return $qb->select('c, p')->leftJoin('c.param', 'p');
我真的不明白下面发生了什么,数据库请求的数量仍然下降到 4 个查询。