Doctrine2 ORM не обновляет объекты, которые изменены вне сценария

Я действительно не знал, как назвать это или искать уже размещенный вопрос, так что извиняюсь, если это было замечено здесь раньше.

Я получаю некоторые нежелательные результаты со следующим кодом:

// get object managers $fooManager = $this->getContainer()->get('foo_manager'); $barManager = $this->getContainer()->get('bar_manager'); // infinite loop for (;;) { // keep getting unitialized "foo" objects, or quit if none while (($foo = $fooManager->findUninitialized()) !== null) { // an uninitialized "foo" will need to make a "bar" object $bar = $barManager->create(); $bar->setA('...'); // save "bar" to database, update() WILL perform a flush() $barManager->update($bar); // make the association of "bar" to "foo" $foo->setBar($bar); // save "foo" to database, update() WILL perform a flush() $fooManager->update($foo); } // keep getting unprocessed "foo" objects, or quit if none while (($foo = $fooManager->findUnprocessed()) !== null) { // process the data from "foo" object's "bar" process($foo->getBar()->getB()); } } 

Вы можете видеть, что в первом цикле while создаются и помещаются объекты $bar в базу данных. Другой сценарий подбирает их и делает для них что-то.

Во втором цикле while объекты $foo пытаются получить доступ к их модифицированному « getB() » объекту (обратите внимание, что getB() , мы можем предположить, что в другом скрипте, выполняемом отдельно, setB() использовался для изменения состояния объект).

Однако во втором цикле, когда я вызываю getB() , он не возвращает значение, которое я установил с помощью setB() в этом другом скрипте.

Я могу обеспечить, чтобы все данные были должным образом сохранены (и сброшены) в базу данных, поэтому, когда getB() вызывается во втором цикле, все, что содержало «B», было изменено и присутствует в базе данных.

Одна вещь, которую я заметил, это то, что в файле журнала я не вижу запроса, чтобы вытащить данные для «bar», когда я вызываю $foo->getBar() во втором цикле (они должны быть лениво загружены). Кроме того, если я var_dump() значение, возвращаемое из $foo->getBar() во втором цикле, выглядит точно так же, как связанный объект «bar» будет выглядеть к концу первого цикла.

Я думаю, что есть какое-то кэширование или что-то происходит (поскольку я изменил эти «барные» объекты ранее в выполнении сценария, Doctrine кажется, что он просто повторно использует их, а не перезагружает свои данные из базы данных ).

Я знаю, что я пытаюсь сделать, вероятно, не часто. То, что я делаю, это использовать функции консоли консоли Symfony2, чтобы написать несколько «демонов» из командной строки, чтобы помочь в обработке некоторых данных; «демон», который содержит этот код, запускается вместе с другим «демоном», который обрабатывает созданные объекты «bar».

Любопытно, есть ли способ исправить это, где в моем втором цикле, когда я вызываю метод $foo->getBar() , я фактически вытаскиваю обновленные данные из базы данных. Любая помощь приветствуется.

Solutions Collecting From Web of "Doctrine2 ORM не обновляет объекты, которые изменены вне сценария"