我使用EntityType
创建表单,但未映射到实体。表单很长,用户多次重复使用相同的选项,然后当他对表单有效时,如果它有效,我会将$form->getData()
存储在会话中。
当我生成表单时,我会注入$data
。除了EntityType
之外,它适用于所有选项,我不明白为什么......
在$data
中,我ArrayCollection
在EntityType
中选择了对象,但表单未选中它。我使用了mapped = false
,因为如果删除它我就会出错:
必须管理传递到选择字段的实体。也许坚持他们在实体经理?
有人我知道怎么做?
答案 0 :(得分:3)
在这种情况下,设置mapped = false
不应该是解决方案,因为您需要将存储的数据写入此字段,对吧?因此mapped = false
可以避免它(请参阅有关mapped
选项here)
此处的问题是EntityType
需要从每个项获取id
值,并且要求实际管理这些项 EntityManager
:
必须管理传递到选择字段的实体。也许坚持他们在实体经理?
当实体的持久性由MANAGED
管理时,实体处于EntityManager
状态。换句话说,如果实体从数据库中提取或通过EntityManager#persist
注册为新实体,则对其进行管理。
在这种情况下,这些实体来自会话,因此您有两个选项:
从数据库中重新查询存储的实体:
if (isset($data['foo']) && $data['foo'] instanceof Collection) {
$data['foo'] = $this->getDoctrine()->getRepository(Foo::class)->findBy([
'id' => $data['foo']->toArray(),
]);
}
或者,设置自定义choice_value
选项以避免使用默认选项:
$form->add('foo', EntityType::class, [
'class' => Foo::class,
'choice_value' => 'id', // <--- default IdReader::getIdValue()
]);