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()
。但是在表格的某处
当我将表单嵌入到另一个表单时,我遇到了这个问题,它们是多对一的关系,但是在保存数据时 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()
。但是在表格的某处