我想更新多个实体,并通过更新添加一个名为“comment”的字段。该字段与实体无关;我会将评论保存在单独的表格中。
这是我尝试过的(下面的控制器代码) -这只是代码示例,但应该让我了解我正在尝试做什么:
$form = $this->createFormBuilder();
foreach (array(1,2,3) as $id) {
$subform = $this->createFormBuilder()
->add('story', 'entity', array(
'class' => 'AcmeDemoBundle:Story',
'query_builder' => function($em) use ($id) {
$qb = $em->createQueryBuilder('s')
$qb->select(array('j'))
->add('from', 'AcmeDemoBundle:Story')
->addWhere('j.id = :id')
->setParameter('id', $id);
return $qb;
},
'property' => 'id',
'required' => true, 'expanded' => true, 'multiple' => true
)
->add('comment', 'textarea');
}
$form->add($subform, '', array('label' => '');
...
// then I send the form to the template with $form->createView()
我期望看到的是一个表单,每个实体(1,2,3)作为一个复选框,旁边是一个注释块。相反,我只得到一个复选框和一个注释,并且总是针对数组中的最后一个实体(在上述情况下,实体编号为 3)。似乎表单构建器忽略了我添加的所有子表单,只使用最后一个 - 在查看进入数据库的 SQL 时也是这种情况,只有一个选择 #3 而没有选择 1 和2.
鉴于生成的 html 支持我正在尝试做的事情,我希望上述内容能够正常工作:
<input type="checkbox" id="form_form_story_0" name="form[form][story][]" value="3">
<textarea id="form_form_comment" name="form[form][comment] />
我也尝试为字段提供唯一名称 - 例如 ->add('story_' . $id) 等,但这并没有做任何事情。我还尝试给每个查询构建器一个唯一的名称 $em->createQueryBuilder('s'.$id) 但这也不起作用。
此外,如果我删除 query_builder (并且只使用该类),它也不起作用
更新:它似乎与实体没有任何关系,即使我尝试使用纯文本字段创建子表单,它也不起作用......
如果子表单具有不同的名称,则更新 2 :
$subForm = $this->get('form.factory')->createNamedBuilder("form$id"), 'form', array())
然后它工作。不幸的是,这意味着我无法遍历树枝内的子表单。