我有两个实体Client
和Contact
。他们之间存在一对多的关系,客户有很多联系人。该关联以fetch="EAGER"
注释,并且在查看联系人时始终需要联系信息是合理的(在所有情况下都不是,但公平概括)。
但是,我不是一直确保在查看客户端时自动加入联系人只运行一个查询,而是观察一些对我来说很奇怪的行为,特别是在Choice字段中显示客户列表时在表格上。查看Doctrine日志输出,而不是执行单个查询并使用结果显示客户端名称列表,而是查询获取所有客户端,然后多个查询获取所有联系人的数据,每个联系人一个。在这种情况下,实际上并不需要联系人数据,并且我通过简单地删除`fetch =" EAGER"来成功地阻止了这种行为。这似乎与渴望获取的期望行为相反,它实际上具有相反的效果。
当用于填充“选择”字段时,为什么没有按预期使用单个查询将联系人数据与客户端信息一起提取?
我已经通过框架跟踪代码,在Doctrine水合代码中逐一查看查询,但这并没有让我明白为什么会发生这种情况。我的宠物理论涉及与选择领域相关的复杂事情"打断"什么原则通常会做什么,并迫使它在正常的后期阶段获取额外的数据,但我没有什么可以支持的。
客户表单字段
$form->add(
'client',
'entity',
[
'class' => 'AppBundle:Client',
'choice_label' => 'name',
]
);
客户联系人
/**
* @ORM\OneToMany(targetEntity="Contact", mappedBy="client", fetch="EAGER", cascade={"persist", "remove"})
* */
private $contacts;
答案 0 :(得分:0)
您是否尝试将query_builder
添加到EntityType
提交的文件中?
示例强>
$form
->add('client', EntityType::class, [
'class' => Client::class,
'choice_label' => 'name',
'query_builder' => function (EntityRepository $entityRepository) {
return $entityRepository->createQueryBuilder('this');
},
]);