У меня есть следующая диаграмма классов:
Когда я пытаюсь сохранить $blockImage
коллекция на новый ImageContentBlock
первый ImageContentBlockImage
объект (всегда тот, с $order = 1
) удаляется из коллекции и не сохраняется. Я могу проследить его существование до того момента, когда я фактически сохраню (и сбрасываю) объект.
ImageContentBlock
=> ImageContentBlockImage
отношение определяется как OneToMany
, где ImageContentBlockImage
объект как ManyToOne
отношение с JoinColumn
, ImageContentBlockImage
=> Image
отношение является ManyToOne
связь. Все эти отношения используют следующие каскадные параметры: cascade={"merge", "persist", "detach"}
Объекты временно добавляются, управляются и редактируются в сериализованной строке через Redis, прежде чем они сохраняются. Объекты правильно извлекаются из Redis и снова сохраняются в нем.
У меня есть следующий код, когда я получаю объекты из Redis и намерен сохранить их в диспетчере сущностей. Объекты необходимо объединить (прикрепить) после их отсоединения.
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);
}
}
Я читал об ограничениях Доктрины и ее плохих практиках. Я думаю, это один из них? Но мне нужна эта настройка для работы. Как мне этого добиться?
Изменить 1:
Я копался в этой ошибке еще дальше. я нашел эта проблема здесь, на StackOverflow. Этот чувак отладил EntityManager
и UnitOfWork
, Когда я добавлю 3 ImageContentBlockImage
возражает против ImageContentBlock
возражать они добавлены к UnitOfWork
и отмечены для настойчивости. Но один, первый, никогда не записывается в БД. Их решение состоит в том, чтобы сохранить временные данные в базе данных и не сохранять их в сеансе (Redis в моем случае). Я использую много запросов, которые управляют этими объектами, это замедлит работу пользователя. Так как я могу заставить это работать?
Изменить 2:
При попытке создать новый ImageContentBlock
объект с 3 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
операция, после выполнения некоторых merge
операции и тому подобное. Я думаю, мне придется посмотреть в поток.
Тем не менее, если кто-то может указать мне в правильном направлении ..
Изменить 3:
Хорошо, я тестировал с Сериализатор JMS исключить проблему php-serialiser, которая есть в Doctrine. Когда я отлаживаю приложение, я вижу новый ImageContentBlockImage
добавляется с его (уникальным) Image
объект. Все ImageContentBlockImage
объекты имеют свои Image
, После отправки страницы, которая содержит Block
объекты, и массив десериализован из Redis, я вижу, что 2 ImageContentBlockImage
объекты имеют ссылку на то же самое Image
объект. Эта ссылка уникальна, когда я нахожусь на странице и добавляю изображение.
Задача ещё не решена.
Других решений пока нет …