我有两个实体:专业化和课程。 一个专业有很多课程,所以关系是“OneToMany”和“ManyToOne”。
我想分别创建专业和课程,然后通过多个选择将许多课程附加到专业化。 我还需要从专业化中删除(分离)课程,但不删除课程实体。 所以,我这样做了:
->add('courses', 'sonata_type_model', [
'multiple' => true,
'property' => 'title',
])
但是当我从specialization-edit -page中的select-field中删除相关课程时,也会从DB中删除课程对象。 我试图从关系中删除orphanRemoval属性,但是当我尝试从专业化中分离课程时,没有任何反应。
所以,我的问题是: 我如何才能在SonataAdminBundle中实现仅从父实体中分离子实体?
答案 0 :(得分:0)
我解决了!
解决方案: 我决定使用save-hooks(我的SpecialisationAdmin类中的prePersist和preUpdate方法)。
主要想法 - 从专业化中取消所有相关课程,然后设置来自表格的课程。
但是如果我从编辑页面上的专业化中删除任何课程,我就不会在preUpdate方法中的专业化对象中获取它们的对象。 如果我没有获得课程对象,我就无法将其专业化设置为NULL。
因此,此问题的解决方案是使用snapshot属性在提交表单之前获取所有专业化课程并将其专业化设置为NULL,然后将当前专业化设置为来自表单的课程:
/**
* @param Specialisation $specialisation
*/
public function prePersist($specialisation)
{
$this->preUpdate($specialisation);
}
/**
* @param Specialisation $specialisation
*/
public function preUpdate($specialisation)
{
if (isset($specialisation->getCourses()->snapshot)) {
foreach ($specialisation->getCourses()->getSnapshot() as $course) {
$course->setSpecialisation(null);
}
}
foreach ($specialisation->getCourses() as $course) {
$course->setSpecialisation($specialisation);
}
}