Доктрина: продолжает отбрасывать первое новое отношение ManyToOne

У меня есть следующая диаграмма классов:

введите описание изображения здесь

Когда я пытаюсь сохранить $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 объект. Эта ссылка уникальна, когда я нахожусь на странице и добавляю изображение.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]