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 ORM + Symfony 2)