php约束如何删除,php – 禁用Doctrine外键约束

根据定义,如果不将键设置为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_pa​​ge_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值,然后您甚至不需要在删除时执行生命周期回调.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值