问题描述
我具有以下数据库结构和关系:
帖子-> OnetoMany,cascade = {“ persist”}-> 回复-> OnetoMany,cascade = {“ persist”}-> 文件实体 + 磁盘上的文件-> 事件以删除文件实体
帖子-> OnetoMany,cascade = {“ persist”}-> 文件实体 + 磁盘上的文件-> 事件删除文件实体
关于文件的事情是:
我需要的是,如果帖子被删除,它会级联地删除回复,文件实体及其在磁盘上的文件。事件链是:
- 页面控制器:
post->remove();
- 上课时间:
remove()
{
PostFile::deleteFiles($this);
Reply::deleteFiles($this);
$em->remove($this);
$em->flush();
}
- PostFile:
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);
}
}
}
- ReplyFile:
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();
});
一切都顺畅,例如所有内容都会被删除,但帖子本身不会被删除,必须删除两次。为什么会这样?
解决方法
将OneToMany,cascade = {“ persist”}更改为OneToMany,cascade = {“ remove”}似乎已解决,现在,所有内容在第一次尝试时都会被删除