我有以下类图:
当我尝试将$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
对象。当我在页面上添加图像时,此引用是唯一的。