教义删除必须进行两次

Posted

技术标签:

【中文标题】教义删除必须进行两次【英文标题】:doctrine deleting has to be done twice 【发布时间】:2020-11-11 13:46:43 【问题描述】:

我有以下数据库结构和关系:

Posts -> OneToMany,cascade="persist" -> Replies -> OneToMany,cascade="persist" -> 文件实体 + 磁盘上的文件 -> 事件删除文件实体

帖子 -> OneToMany,cascade="persist" -> 文件实体 + 磁盘上的文件 -> 事件 删除文件实体

关于文件的事情是:

删除文件实体(从应用程序)删除磁盘上的文件 (从文件管理器)删除磁盘上的文件会触发删除文件实体的事件

我需要的是,如果帖子被删除,它会一直级联到删除回复、文件实体及其在磁盘上的文件。事件链是:

    页面控制器:
post->remove();
    岗位类:
remove()

    PostFile::deleteFiles($this);
    Reply::deleteFiles($this);
    $em->remove($this);
    $em->flush();


    邮政文件:
deleteFiles($post)

    $files = $post->getFiles()->toArray();
    foreach ($files as $file) 
        $f->delete();
    

    回复:
deleteFiles($post)

    $replies = $post->getReplies()->toArray();
    foreach ($replies as $reply) 
        if ($reply) 
            ReplyFile::deleteFiles($reply);
        
    

    回复文件:
deleteFiles($reply)

    $files = $reply->getFiles()->toArray();
    foreach ($files as $file) 
        $f->delete();
    

    文件删除事件:
Events::addListener('on_file_delete', function($event) 
    $f = $event->getFileObject();
    $fid = $file->getFileID();
    $fpf = PostFile::getByFileID($fid);
    $fpf->delete();
    $fpmf = ReplyFile::getByFileID($fid);
    $fpmf->delete();
);

整个链条都运行良好,例如一切都被删除了,除了帖子本身没有被删除,它必须被删除两次。为什么会这样?

【问题讨论】:

你不需要在 (s.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/…) 之间坚持吗?我认为无需坚持,您只需将其从 Unit of Work 中删除即可。 我已将 OneToMany,cascade="persist" 更改为 OneToMany,cascade="remove",现在似乎可以正常工作了 做出回答并接受。对以后的访问者会有帮助(如果正确的话);)。 【参考方案1】:

将 OneToMany,cascade="persist" 更改为 OneToMany,cascade="remove" 似乎已修复它,现在第一次尝试时所有内容都会被删除

【讨论】:

以上是关于教义删除必须进行两次的主要内容,如果未能解决你的问题,请参考以下文章

定时删除日志

spring boot webflux中如何根据条件进行两次删除操作?

必须使用延迟实例化的UI视图将子视图添加到视图控制器两次

必须按两次才能进行 Swift 3 按钮操作

MS Access:需要按两次退格键才能删除从 Excel 复制过来的一个字符

dataTable如何重新初始化