Doctrine flush не обновляет связанный объект коллекции

У меня есть некоторые функции, которые изменяют каждый элемент в коллекции объекта:

foreach ($screen->getBlocks() as $block) {
        $block->setSomeField();
}

После этого я пытаюсь сохранить объект в базе данных:

$this->em->persist($screen);
$this->em->flush();

Свойство Screen :: $ blocks имеет аннотации:

/**
 * @ORM\OneToMany(targetEntity = "App\Entity\Block", mappedBy = "screen", cascade = {"remove", "persist"}, orphanRemoval=true)
 * @ORM\OrderBy({"position": "ASC"})
 * @Groups({"block"})
 * @ApiSubresource
 * @Assert\Valid
 *
 * @var Block[]|Collection
 */
private $blocks;

Перед сбросом я вижу, что объекты в коллекции изменены, но после - значения возвращаются обратно, кажется, что entityManager снова захватывает, если из базы данных. Единственное решение, которое сработало для меня, - это добавить $ this-> em-> clear (); перед сбросом, но я не могу понять логику ..

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
0
723
2

Ответы 2

Можете ли вы попробовать переместить персист по циклу foreach следующим образом:

$this->em->persist($screen);
foreach ($screen->getBlocks() as $block) {
    $block->setSomeField();
}
$this->em->flush();

попробуйте следующий метод и посмотрите по-другому

dump($screen->getBlocks());
foreach ($screen->getBlocks() as $block) {
    $block->setSomeField();
    dump(block);
}
dump($screen->getBlocks());    

Другие вопросы по теме