Symfony2 - 嵌入式表格不保存 parent ID

Symfony2 - Embedded Form is not saving parent ID

当我将表单嵌入到另一个表单时,我遇到了这个问题,它们是多对一的关系,但是在保存数据时 children 没有将 id 保存到数据库中。

假设我的 parent 实体是大学,child 是学院。一所大学可以有很多院系。

Parent.

class University
{
    /**
     * @ORM\OneToMany(targetEntity="UniversityFaculty", mappedBy="university", cascade={"persist"})
     */
    private $faculties;

    public function __construct()
{
    $this->faculties = new ArrayCollection();
}

/**
 * Add faculty
 *
 * @param UniversityFaculty $faculty
 *
 * @return University
 */
public function addFaculty(UniversityFaculty $faculty)
{
    $this->faculties[] = $faculty;

    return $this;
}

/**
 * Remove faculty
 *
 * @param UniversityFaculty $faculty
 */
public function removeFaculty(UniversityFaculty $faculty)
{
    $this->faculties->removeElement($faculty);
}

Child.

class Faculty
{
    /**
     * @var University
     *
     * @ORM\ManyToOne(targetEntity="University", inversedBy="faculties", cascade={"persist"})
     * @ORM\JoinColumn(name="university_id", referencedColumnName="id")
     */
    private $university;

    // ...

我建立了一个表格:

->add('faculties', BootstrapCollectionType::class, array(
            'type'                  => UniversityFacultyType::class,
            'allow_add'             => true,
            'allow_delete'          => true,
            'add_button_text'       => 'Add Faculty',
            'delete_button_text'    => 'Delete Faculty',
            'sub_widget_col'        => 9,
            'button_col'            => 3,
            'required'              => false,
            'by_reference'          => false
        ))

BootstrapCollectionType 只是 CollectionType 由 BraincraftBootstrapBundle 自定义,所以我不需要为添加或删除按钮创建 JS 和 CSS。

我阅读了文档并且已经在大学实体中添加了添加和删除方法,还有 cascade={"persist"}by_reference => false,并且一切正常,除了它仍然没有在 Faculty [=39] 中保存大学 ID =] 在数据库中(其他列被保存)。

知道我遗漏了什么吗?

您没有将大学分配给新学院。

有很多方法可以做到。

例如:

public function addFaculty(UniversityFaculty $faculty)
{
    $faculty->setUniversity($this);
    $this->faculties[] = $faculty;

    return $this;
}

或者:

->add('faculties', BootstrapCollectionType::class, array(
            'type'                  => UniversityFacultyType::class,
            'allow_add'             => true,
            'allow_delete'          => true,
            'add_button_text'       => 'Add Faculty',
            'delete_button_text'    => 'Delete Faculty',
            'sub_widget_col'        => 9,
            'button_col'            => 3,
            'required'              => false,
            'by_reference'          => false,
            'empty_data' => function (FormInterface $form) {
               $faculty = UniversityFaculty();
               $faculty->setUniversity($form->getParent()->getData());
               return $price; 
            },
        ))

也许,大学在$form->getData(),而不是$form->getParent()->getData()。但是在表格的某处