删除原则必须进行两次

问题描述

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

帖子-> OnetoMany,cascade = {“ persist”}-> 回复-> OnetoMany,cascade = {“ persist”}-> 文件实体 + 磁盘上的文件-> 事件删除文件实体

帖子-> OnetoMany,cascade = {“ persist”}-> 文件实体 + 磁盘上的文件-> 事件删除文件实体

关于文件的事情是:

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

  1. 页面控制器:
post->remove();
  1. 上课时间:
remove()
{
    PostFile::deleteFiles($this);
    Reply::deleteFiles($this);
    $em->remove($this);
    $em->flush();
}

  1. PostFile:
deleteFiles($post)
{
    $files = $post->getFiles()->toArray();
    foreach ($files as $file) {
        $f->delete();
    }
}
  1. 回复
deleteFiles($post)
{
    $replies = $post->getReplies()->toArray();
    foreach ($replies as $reply) {
        if ($reply) {
            ReplyFile::deleteFiles($reply);
        }
    }
}
  1. ReplyFile:
deleteFiles($reply)
{
    $files = $reply->getFiles()->toArray();
    foreach ($files as $file) {
        $f->delete();
    }
}
  1. 文件删除事件:
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();
});

一切都顺畅,例如所有内容都会被删除,但帖子本身不会被删除,必须删除两次。为什么会这样?

解决方法

将OneToMany,cascade = {“ persist”}更改为OneToMany,cascade = {“ remove”}似乎已解决,现在,所有内容在第一次尝试时都会被删除