Doctrine 2 ORM 级联删除相关实体

Posted

技术标签:

【中文标题】Doctrine 2 ORM 级联删除相关实体【英文标题】:Doctrine 2 ORM Cascading remove related entities 【发布时间】:2015-11-07 07:37:51 【问题描述】:

我想检查我的语法对于级联删除以下实体是否正确,我希望当我删除主题或用户时,它会级联并删除与其相关的教师实体。

教师实体

class Teacher

    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     **/
    protected $id;

    /** @ORM\Column(type="integer")
     * @ORM\ManyToOne(targetEntity="Subject")
     * @ORM\JoinColumn(name="subjectId", referencedColumnName="id",  onDelete="CASCADE")
     *  */
    protected $subjectId;

    /** @ORM\Column(type="integer")
     * @ORM\ManyToOne(targetEntity="User")
     * @ORM\JoinColumn(name="userId", referencedColumnName="id",  onDelete="CASCADE")
     *  */
    protected $userId;


主题实体

/** @ORM\Entity */
class Subject
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     */
    protected $id;

    /** @ORM\Column(type="integer") */
    protected $sectionId;

    /** @ORM\Column(type="string") */
    protected $subjectName;

用户实体

/** @ORM\Entity */
class User 
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     */
    protected $id;

    /** @ORM\Column(type="string") */
    protected $username;

    /** @ORM\Column(type="string") */
    protected $password;

    /** @ORM\Column(type="string") */
    protected $first_name;

    /** @ORM\Column(type="string") */
    protected $middle_name;

    /** @ORM\Column(type="string") */
    protected $last_name;

    /** @ORM\Column(type="string") */
    protected $sex;

    /** @ORM\Column(type="date") */
    protected $dob;

    /** @ORM\Column(type="boolean") */
    protected $is_active;

    /** @ORM\Column(type="boolean") */
    protected $is_admin;

    /** @ORM\Column(type="string") */
    protected $email;

    /** @ORM\Column(type="string") */
    protected $address;

    /** @ORM\Column(type="string") */
    protected $bloodTypeId;

    /** @ORM\Column(type="string") */
    protected $photo;

    /** @ORM\Column(type="integer") */
    protected $userTypeId;

因为当我删除用户或主题时它似乎不起作用,我希望与他们的领域相关的老师也被删除。

【问题讨论】:

结帐this answer。您正在使用 @joinColumn 中的数据库级级联,而不是使用 cascade="remove" 进行 ORM 级别的删除。如果您确实想要 DB 级级联,那么您还需要运行 create/update schema cli 工具,以便将它们添加到 DB。 【参考方案1】:

如果您在堆栈上搜索overlflow,您的答案已经是 here

Doctrine 中有两种级联:

1) ORM 级别 - 在关联中使用 cascade="remove" - 这是在 UnitOfWork 中完成的计算,不会影响数据库结构。当您移除一个对象时,UnitOfWork 将遍历关联中的所有对象并移除它们。

2) 数据库级别 - 在关联的 joinColumn 上使用 onDelete="CASCADE" - 这会将 On Delete Cascade 添加到数据库中的外键列:


您的onDelete="CASCADE" 主题和教师内的用户将有以下结果:当您删除教师时,该操作将级联到主题和用户(因此它们也被删除)。我认为这不是你想要的......

【讨论】:

【参考方案2】:

不,我想在删除用户时删除老师,当我删除主题时也删除老师

【讨论】:

以上是关于Doctrine 2 ORM 级联删除相关实体的主要内容,如果未能解决你的问题,请参考以下文章

Doctrine 2 中的级联“刷新”是啥意思?

级联持久性不工作(Doctrine ORM + Symfony 2)

教义 2 OneToMany 级联设置 NULL

Symfony2/Doctrine:如何使用 OneToMany 将实体重新保存为级联新行

实体框架级联删除(继承)

python django中的orm外键级联删除