在我的表单类型上,我添加了另一个子窗体
// ParentFormType
$builder->add('children', 'collection', array(
'type' => new ChildFormType(),
'prototype' => true,
'allow_delete' => true,
'allow_add' => true,
));
// ChildFormType
$builder->add('age', 'text', array(
'required' => true));
当我尝试保存表单以为孩子并设置父项时,有没有办法避免这种情况。
$em = $this->get('doctrine.orm.entity_manager');
/** This foreach I want to avoid */
foreach ($parent->getChildren() as $child) {
$child->setParent($parent);
}
$em->persist($parent);
$em->flush();
以下是来自父级的ORM-XML:
<one-to-many field="children" target-entity="Client'Bundle'WebsiteBundle'Entity'Children" mapped-by="parent">
<cascade>
<cascade-persist />
</cascade>
</one-to-many>
以下是来自父级的ORM-XML:
<many-to-one field="parent" target-entity="Client'Bundle'WebsiteBundle'Entity'Parent" inversed-by="children">
<join-columns>
<join-column name="idParents" referenced-column-name="id" on-delete="CASCADE" nullable="false" />
</join-columns>
</many-to-one>
除了 Koalabaerchen 的答案之外,为了让 handleRequest 在父实体上调用 addChild 方法,您应该将by_reference设置为 false(请参阅文档):
// ParentFormType
$builder->add('children', 'collection', array(
...
'by_reference' => false,
));
在父实体的 setter 中,您可以执行以下操作
public function addChild(Child $children)
{
$this->children->add($children);
$children->setParent($this);
return $this;
}
现在,每次将子项添加到实体时(集合都会发生),它还会将父项设置在子项中。