By 定义如果不将外键设置为空,则无法删除外键指向的记录(onDelete="SET NULL"
)或级联删除操作(有两种选择 https://stackoverflow.com/a/6334710/1697459- ORM级别:cascade={"remove"}
|数据库级别:onDelete="CASCADE"
).
还有一个替代方案设置仍然存在的记录的默认值 https://www.mssqltips.com/sqlservertip/2365/sql-server-foreign-key-update-and-delete-rules/,但你必须手动执行此操作,我不认为 Doctrine 支持这种“开箱即用”(如果我错了,请纠正我,但在这种情况下设置默认值无论如何都是不需要的)。
这种严格性反映了具有外键约束的概念;就像@Théo 说的:
FK是为了保证数据的一致性.
软删除(已经提到)是一种解决方案,但您还可以做的是添加一个额外的removed_page_id
您同步的列page_id
就在您将其删除之前preRemove
事件处理程序(生命周期回调)。我想知道这些信息是否有任何价值,但我想你对它有一些用处,否则你不会问这个问题。
我绝对是不声称这是好的做法,但它至少是您可以用于边缘情况的东西。所以有这样的事情:
In your Revision
:
/**
* @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;
然后在你的Page
:
/**
* @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
建设过程中的价值Revision
,那么您甚至不需要在删除时执行生命周期回调。