Doctrine:不断删除第一个新的ManyToOne关系

时间:2016-09-14 13:45:08

标签: php orm doctrine-orm doctrine doctrine-extensions

我有以下类图:

enter image description here

当我尝试将$blockImage集合保留在 ImageContentBlock时,第一个ImageContentBlockImage对象(始终是$order = 1的对象)是从集合中删除而不是持久化。我可以追溯它现有的背部,直到我实际上持续(和冲洗)对象。

ImageContentBlock => ImageContentBlockImage关系定义为OneToMany,其中ImageContentBlockImage对象与ManyToOne的{​​{1}}关系。 JoinColumn => ImageContentBlockImage关系是Image关系。所有这些关系都使用以下级联选项:ManyToOne

在持久化之前,通过Redis临时添加,管理和编辑对象的序列化字符串。正确地从Redis中检索对象并再次将其存储回来。

当我从Redis中获取对象并打算将它们保存在实体管理器中时,我有以下代码。分离后,需要合并(附加)对象。

cascade={"merge", "persist", "detach"}

我已经了解了Doctrine及其不良做法的局限性。我猜这是其中之一?但我确实需要这个设置才能工作。我怎样才能做到这一点?

编辑1: 我甚至进一步深入研究了这个bug。我找到了this issue here on StackOverflow.这个家伙调试了if ($block instanceof ImageContentBlock) { /** * @var ImageContentBlock $block * @var ImageContentBlockImage $blockImage * @var Image $mergedImage * @var ArrayCollection $images ; */ $blockImages = $block->getBlockImages(); $block->setBlockImages(new ArrayCollection()); foreach ($blockImages as $blockImageUuid => $blockImage) { // merge the image? $image = $blockImage->getImage(); $blockImage->setImage(new Image()); $image = $entityManager->merge($image); $blockImage->setImage($image); // set the image block $blockImage->setBlock($block); if (!is_null($blockImage->id)) { $blockImage = $entityManager->merge($blockImage); } if (is_null($blockImage->id)) { $entityManager->persist($blockImage); } // put it back! $block->putImageContentBlockImage($blockImage, $blockImageUuid); } } EntityManager。当我向UnitOfWork对象添加3个ImageContentBlockImage个对象时,它们会被添加到ImageContentBlock并标记为持久性。但是,第一个,从未写入数据库。他们的解决方案是将临时数据保存到数据库中,而不是保持会话(在我的情况下是Redis)。我使用了很多管理这些对象的请求,这会降低用户体验。那么我该如何强制执行此工作呢?

编辑2: 尝试使用3个UnitOfWork对象创建新的ImageContentBlock对象时。 ImageContentBlockImage的输出是;

UnitOfWork

我可以看到array (size=3) '0000000001fdf8f000000000117b20f8' => object(stdClass)[1214] public '__CLASS__' => string 'Pagewize\Domain\Block\ContentBlock\Image\ImageContentBlockImage' (length=63) public 'block' => string 'Pagewize\Domain\Block\ContentBlock\Image\ImageContentBlock' (length=58) public 'image' => string 'PagewizeProxy\__CG__\Pagewize\Domain\File\Image' (length=47) [..] '0000000001fdf8f200000000117b20f8' => object(stdClass)[1255] public '__CLASS__' => string 'Pagewize\Domain\Block\ContentBlock\Image\ImageContentBlockImage' (length=63) public 'block' => string 'Pagewize\Domain\Block\ContentBlock\Image\ImageContentBlock' (length=58) public 'image' => string 'PagewizeProxy\__CG__\Pagewize\Domain\File\Image' (length=47) [..] '0000000001fdf8fb00000000117b20f8' => object(stdClass)[1257] public '__CLASS__' => string 'Pagewize\Domain\Block\ContentBlock\Image\ImageContentBlock' (length=58) public 'blockImages' => string 'Array(3)' (length=8) 中缺少一个ImageContentBlockImage个对象。这是在我执行一些UnitOfWork操作之后调用flush操作之前。我想我必须深入了解这一流程。

如果有人可以指出我正确的方向..

编辑3: 好吧,我一直在测试JMS Serializer以排除Doctrine所具有的php-serialiser问题。当我调试应用程序时,我可以看到新的merge添加了其(唯一的)ImageContentBlockImage对象。所有Image个对象都有自己的ImageContentBlockImage。在提交包含Image个对象的页面并从Redis反序列化数组后,我可以看到2个Block个对象引用了同一个ImageContentBlockImage对象。当我在页面上添加图像时,此引用是唯一的。

0 个答案:

没有答案