如何在没有删除Sonata AdminBundle中的实体的情况下分离关系?

时间:2017-09-11 09:21:32

标签: symfony doctrine-orm entity-relationship sonata-admin sonata

我有两个实体:专业化和课程。 一个专业有很多课程,所以关系是“OneToMany”和“ManyToOne”。

我想分别创建专业和课程,然后通过多个选择将许多课程附加到专业化。 我还需要从专业化中删除(分离)课程,但不删除课程实体。 所以,我这样做了:

->add('courses', 'sonata_type_model', [
                        'multiple' => true,
                        'property' => 'title',
                    ])

但是当我从specialization-edit -page中的select-field中删除相关课程时,也会从DB中删除课程对象。 我试图从关系中删除orphanRemoval属性,但是当我尝试从专业化中分离课程时,没有任何反应。

所以,我的问题是: 我如何才能在SonataAdminBundle中实现仅从父实体中分离子实体?

1 个答案:

答案 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);
        }
    }