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
объекты пытаются получить доступ к своему модифицированному объекту "bar" (обратите внимание наgetB()
будучи вызванным, мы можем предположить, что в другом скрипте выполняется отдельноsetB()
был использован для изменения состояния объекта).
Тем не менее, во втором цикле, когда я звонюgetB()
, это не возвращает значение, которое я установил сsetB()
в этом другом сценарии.
Я могу гарантировать, что все данные должным образом сохраняются (и сбрасываются) в базу данных, поэтому, когдаgetB()
вызывается во втором цикле, все, что удерживало "B", было изменено и присутствует в базе данных.
Одна вещь, которую я заметил, заключается в том, что в файле журнала я не вижу запроса для извлечения данных для «бара», когда я звоню$foo->getBar()
во втором цикле (они должны быть лениво загружены). Кроме того, если яvar_dump()
значение, возвращаемое из$foo->getBar()
во втором цикле это выглядит точно так же, как связанный объект "bar" будет выглядеть к концу первого цикла.
Я думаю, что происходит какое-то кеширование или что-то в этом роде (поскольку я изменил эти «барные» объекты в начале выполнения скрипта, Doctrine кажется, что он просто использует их повторно, а не перезагружает их данные из базы данных ).
Я знаю, что я пытаюсь сделать, вероятно, не часто. Я использую возможности командной консоли Symfony2 для написания нескольких «демонов» командной строки, чтобы помочь с обработкой некоторых данных; «демон», содержащий этот код, запускается вместе с другим «демоном», который обрабатывает созданные объекты «bar».
Любопытно, есть ли способ исправить это, где в моем втором цикле, когда я вызываю$foo->getBar()
метод, я на самом деле вытаскиваю обновленные данные из базы данных. Любая помощь очень ценится.