php – 禁用Doctrine外键约束

我和我的一个模特有关系:
/**
* @ORM\ManyToOne(targetEntity="Page",cascade="persist")
* @ORM\JoinColumn(name="page_id",referencedColumnName="id")
*/
private $parentPage;

当我删除页面时,我收到此错误

Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails

基本上我的模型是页面页面修订.当我删除页面时,我不想删除修订.我还想在页面修订版上保留page_id(即不将其设置为null).

我怎么能用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值,然后您甚至不需要在删除时执行生命周期回调.

相关文章

Hessian开源的远程通讯,采用二进制 RPC的协议,基于 HTTP 传输。可以实现PHP调用Java,Python,C#等多语...
初识Mongodb的一些总结,在Mac Os X下真实搭建mongodb环境,以及分享个Mongodb管理工具,学习期间一些总结...
边看边操作,这样才能记得牢,实践是检验真理的唯一标准.光看不练假把式,光练不看傻把式,边看边练真把式....
在php中,结果输出一共有两种方式:echo和print,下面将对两种方式做一个比较。 echo与print的区别: (...
在安装好wampServer后,一直没有使用phpMyAdmin,今天用了一下,phpMyAdmin显示错误:The mbstring exte...
变量是用于存储数据的容器,与代数相似,可以给变量赋予某个确定的值(例如:$x=3)或者是赋予其它的变...