Php 条令消除Symfony2中的问题

Php 条令消除Symfony2中的问题,php,mysql,symfony,doctrine-orm,persist,Php,Mysql,Symfony,Doctrine Orm,Persist,当我试图使用条令删除实体时,它会为删除的实体运行一个新的INSERT语句 设置如下所示: 表1:文件 表2:画廊 表3:多媒体资料 文件是跟踪上载文件详细信息的独立表。Gallery也是一个存储库信息的独立表。gallery_media是一个动名词(多对多)表,用于将文件与库关联 假设表1和表2有id字段,表3有fileId和galleryId字段 我的条令代码如下(我使用的是Symfony2): 现在当我运行代码时;文件实体将被删除,删除操作将被级联,这意味着相关的库\ U媒体条目也将被删除。

当我试图使用条令删除实体时,它会为删除的实体运行一个新的INSERT语句

设置如下所示:

表1:文件 表2:画廊 表3:多媒体资料

文件是跟踪上载文件详细信息的独立表。Gallery也是一个存储库信息的独立表。gallery_media是一个动名词(多对多)表,用于将文件与库关联

假设表1和表2有id字段,表3有fileId和galleryId字段

我的条令代码如下(我使用的是Symfony2):

现在当我运行代码时;文件实体将被删除,删除操作将被级联,这意味着相关的库\ U媒体条目也将被删除。但随后,删除的实体突然出现在数据库中

My MySQL日志显示以下查询按给定顺序运行:

START TRANSACTION
DELETE FROM file WHERE id = '126'
commit
START TRANSACTION
INSERT INTO file (name) VALUES ('someFileName')
UPDATE gallery SET date_updated = '2014-06-10 09:53:38', count_media = 11 WHERE id = 14
我的完整代码是:

$this->em->remove($filentity);
$this->em->flush();
$newCount= $galleryEntity->getCountMedia() - 1;
$galleryEntity->setCountMedia($newCount);
$this->em->persist(galleryEntity);
$this->em->flush();
我相信shomehow实体在移除后不会分离。但我不确定。可能实体管理器实例混淆了

有没有人遇到过类似的问题?如果是这样的话,我将非常感谢您的反馈


谢谢。

我猜,
$galleryEntity
包含以前删除的文件对象。调用persist时,实体管理器会看到该文件尚未持久化(因为它以前已被删除),并将其插入。尝试在您的
$galleryEntity
中查找
$fileEntity
,然后手动将其删除或
$em->刷新($galleryEntity)
,或者在删除文件后从实体管理器中检索
$galleryEntity
,以确保它不“脏”。

问题是,当您获取Gallery实体时,还可以获取链接到它的所有文件实体。因此,在两个位置都有文件实体:文件实体本身和库实体属性内部

当您调用
remove($fileEntity)
时,您只会杀死独立的文件实体,但它仍然在库属性中。所以你必须做一些类似的事情:
$galleryEntity->remove($filentity)

然后
$this->em->remove($filentity)

由于“文件”和“图库”之间存在多对多关联,“图库媒体”表是由条令自动创建的?您在
\u construct()
方法中是否有任何关联的实体,当您保留一个新的图库实体时,它会通过级联插入?Pete I已手动创建了所有实体。Dan good call:)但是不,我没有:/我的第一个猜测是相同的,但是直到现在我在albumEntity中找不到任何fileEntity的痕迹。还在调试,找到了。我在处理GalleryMedia实体上面的两行代码,当我刷新GalleryMedia实体的更新时,Doctrine实际上也在管理GalleryMedia实体;因此,它被管理删除的文件实体。在删除fileEntity后但更新Gallery之前,我通过分离galleryMedia实体
$this->em->detach($galleryMedia)
修复了此问题。所以你是对的;但我把重点放在了错误的代码上。谢谢
$this->em->remove($filentity);
$this->em->flush();
$newCount= $galleryEntity->getCountMedia() - 1;
$galleryEntity->setCountMedia($newCount);
$this->em->persist(galleryEntity);
$this->em->flush();