根据定义,如果不将键设置为null(onDelete =“SET NULL”)或级联删除操作(
There are two options – ORM级别:cascade = {“remove”} |数据库级别,则无法删除外键指向的记录: onDelete = “CASCADE”).还有
setting a default value of a still existing record的替代方案,但你必须手动完成,我不认为Doctrine支持这种开箱即用(如果我错了请纠正我,但在这种情况下,设置默认值是不可取的无论如何).
这种严格性反映了具有外键约束的概念;喜欢@Théo说:
a FK is to ensure data consistency.
软删除(已经提到)是一种解决方案,但您还可以做的是在preRemove事件处理程序(生命周期回调)中删除之前添加另一个与page_id同步的removed_page_id列.这些信息是否有任何价值我想知道,但我猜你有一些用处,否则你不会问这个问题.
我绝对没有声称这是一个好习惯,但它至少是你可以用于边缘情况的东西.所以有以下几点:
在您的修订版中:
/**
* @ORM\ManyToOne(targetEntity="Page", cascade="persist")
* @ORM\JoinColumn(name="page_id", referencedColumnName="id", onDelete="SET NULL")
*/
private $parentPage;
/**
* @var int
* @ORM\Column(type="integer", name="removed_page_id", nullable=true)
*/
protected $removedPageId;
然后在你的页面中:
/**
* @ORM\PreRemove
*/
public function preRemovePageHandler(LifecycleEventArgs $args)
{
$entityManager = $args->getEntityManager();
$page = $args->getEntity();
$revisions = $page->getRevisions();
foreach($revisions as $revision){
$revision->setRemovedPageId($page->getId());
$entityManager->persist($revision);
}
$entityManager->flush();
}
或者,您当然可以在构建修订版期间设置正确的$removedPageId值,然后您甚至不需要在删除时执行生命周期回调.