Symfony Form 如何自动将父项设置为子项


Symfony Form howto automaticly set parent on child

在我的表单类型上,我添加了另一个子窗体

    // 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;
    }

现在,每次将子项添加到实体时(集合都会发生),它还会将父项设置在子项中。