Doctrine 2 OneToMany Cascade SET NULL

Nic*_*ino 53 null doctrine set one-to-many

错误

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

课程

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;
}
Run Code Online (Sandbox Code Playgroud)

我想要

我想要的是,当你删除教师时,id_teacher被修改为NULL.我想保留出版物但不参考教授.

我不知道在Doctrine中是怎么做的,这可能吗?或者总是与老师的关系?

Dav*_*eto 163

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

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

干杯!

  • 2012年中期回答,今天仍然帮助我!谢谢! (19认同)
  • 请注意,添加此数据库架构后必须更新数据库架构. (17认同)
  • * @ORM\JoinColumn(onDelete="SET NULL") 就足够了 (10认同)
  • 该解决方案直接作用于数据库而不是学说,这很好,但如果您使用像 [soft-deleteable](https://github.com/Atlantic18/DoctrineExtensions/blob/v2.4.x/doc 这样的机制,请小心/softdeleteable.md)。如果您的实体被软删除,它不会触发 SET_NULL 并且您的子实体将指向“已删除”对象。您需要添加一个学说侦听器才能使其工作(取决于您想要的行为)。 (4认同)

Gig*_*ili 7

对于 Symfony 6 (PHP 8)(引擎“InnoDB”)

#[ORM\JoinColumn(nullable: true, onDelete: 'SET NULL')]
Run Code Online (Sandbox Code Playgroud)