Я действительно не знал, как назвать это или искать уже размещенный вопрос, так что извиняюсь, если это было замечено здесь раньше.
Я получаю некоторые нежелательные результаты со следующим кодом:
// 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()
, я фактически вытаскиваю обновленные данные из базы данных. Любая помощь приветствуется.
Это действительно обеспечил пользователь ChocoDeveloper . Использование метода refresh($entity)
в менеджере сущностей решило мою проблему.
Например:
$em->refresh($entity);