Doctrine 2 OneToMany级联设置为NULL

77

错误

无法删除或更新父行:外键约束失败。

这些类

class Teacher {

    /**
     *@ORM\OneToMany(targetEntity="publication", mappedBy="teacher")
     */
    protected $publications;
}

class Publication {

    /**
     * @ORM\ManyToOne(targetEntity="Teacher", inversedBy="publications")
     * @ORM\JoinColumn(name="teacher_id", referencedColumnName="id")
     */
    protected $teacher;
}

我想要

我想要的是,当你删除一个教师时,id_teacher被修改为NULL。我想保留该发布内容,但不涉及到教授。

我不知道在Doctrine中如何做到这一点,这是否可能?还是说关系必须始终与教师有关?

2个回答

209

您应该在实体 Publication 的注释中添加选项 onDelete="SET NULL",如下所示:

class Publication
{
    /**
    * @ORM\ManyToOne(targetEntity="Teacher", inversedBy="publications")
    * @ORM\JoinColumn(name="teacher_id", referencedColumnName="id", onDelete="SET NULL")
    */
    protected $teacher;
}

这种修改在表声明中进行注册。因此,你需要进行数据库迁移或模式更改才能使其生效。


36
请注意,在添加此内容后,您需要更新数据库模式。 - priktop
17
@ORM\JoinColumn(onDelete="SET NULL")足够了。 - Vasilii Suricov
6
这个解决方案直接作用于数据库而不是Doctrine,这很好,但是如果你使用像“soft-deleteable”这样的机制,要小心。如果你的实体被软删除,它不会触发SET_NULL,你的子实体将指向一个“已删除”的对象。你需要添加一个Doctrine监听器来使其工作(这取决于你想要的行为)。 - bachinblack

7

针对Symfony 6 (PHP 8)版本

#[ORM\JoinColumn(nullable: true, onDelete: 'SET NULL')]

谢谢,对于初学者来说,请记得在此更改后运行以下命令: php bin/console doctrine:schema:update --force - LinkmanXBP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接