我有很多实体在Symfony2中有ManyToOne和OneToMany关联。众所周知,如果你删除一条记录并且它没有在其他表中的关联上设置空值,事情就会开始变得混乱。那么,当在Symfony2中删除记录时,Symfony2在其他表中将值设置为null的最佳方法是什么?
我需要在我的实体中设置什么以确保它在所有关联中持续存在。
答案 0 :(得分:0)
首先,您可以使用 onDelete 属性为您的实体中的joinColumn注释手动设置FK的ON DELETE
行为:
/**
* @OneToOne(targetEntity="SomeEntity")
* @JoinColumn(name="some_entity_id", referencedColumnName="id", onDelete="cascade")
*/
private $someEntity;
其次,您始终可以为实体删除事件实现事件侦听器。例如:
public function preRemove(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
if (!$entity instanceof SomeEntity) {
return;
}
// Here you can do whatever you want before
// entity record is removed from the DB.
}
您可以使用以下链接阅读有关学说事件系统的信息:
它们之间的区别在于第一种方法适用于数据库层。换句话说,即使您在控制台中使用原始SQL查询删除记录,它也会起作用。第二个更强大,因为您还可以在删除实体时运行任何PHP代码(例如,您可以发送电子邮件等)但如果通过原则删除记录,它将仅触发。