【问题标题】:Doctrine Remove Issue in Symfony2Symfony2 中的教义删除问题
【发布时间】:2014-06-10 08:18:17
【问题描述】:

当我尝试使用原则删除实体时,它会为已删除的实体运行新的 INSERT 语句。

设置如下:

表 1:文件 表 2:图库 表 3:gallery_media

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

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

我的教义代码是这样的(我正在使用 Symfony2):

$this->em->remove($filentity);
$this->em->flush();

现在当我运行代码时;文件实体将被删除,并且删除操作将级联,这意味着关联的 gallery_media 条目也将被删除。但突然间,被删除的实体重新出现在数据库中。

我的 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();

我相信实体在移除后没有分离。但我不确定。也许实体管理器实例混淆了......

有没有人遇到过类似的问题?如果是这样,我将不胜感激。

谢谢。

【问题讨论】:

  • “gallery_media”表是 Doctrine 自动创建的,因为“文件”和“画廊”之间存在多对多关联?
  • __construct() 方法中是否有任何关联实体,当你持久化一个新的画廊实体时,它会被级联插入?
  • Pete 我已经手动创建了所有实体。丹好电话:)但不,我不:/

标签: php mysql symfony doctrine-orm persist


【解决方案1】:

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

【讨论】:

  • 我的第一个猜测是一样的,但直到现在我无法在专辑实体中找到任何文件实体的痕迹。仍在调试中。
  • 找到了。我在上面处理 GalleryMedia 实体几行,当我刷新 Gallery Entity 的更新时,Doctrine 实际上也在管理 GalleryMedia 实体;因此它是管理删除的 FileEntity。我在删除 fileEntity 之后但在更新 Gallery 之前通过分离 galleryMedia 实体 $this->em->detach($galleryMedia) 解决了这个问题。所以你是对的;但我专注于代码的错误部分。谢谢。
【解决方案2】:

问题在于,当您获得 Gallery 实体时,您还会获得与其链接的所有 File 实体。所以 Doctrine 在两个地方都有 File 实体:File 实体本身和 Gallery 实体属性。

当您调用 remove($fileEntity) 时,您只会杀死独立的 File 实体,但它仍会进入 Gallery 属性。所以你必须做类似的事情: $galleryEntity->remove($filentity); 然后$this->em->remove($filentity);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 2016-05-16
    相关资源
    最近更新 更多