我真的不知道如何给这个标题或搜索一个已经发布的问题,所以如果以前在这里见过这个问题,我深表歉意。
我使用以下代码得到了一些不需要的结果:
// 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
loop, $bar
正在制作对象并将其放入数据库中。另一个脚本正在处理这些并对其进行处理。
在第二while
循环,$foo
对象正在尝试访问其修改后的“bar”对象(注意getB()
被调用时,我们可以假设在另一个脚本中单独执行setB()
用于改变对象的状态)。
但是,在第二个循环中,当我调用getB()
,它没有返回我设置的值setB()
在另一个脚本中。
我可以确保所有数据都正确地保存(并刷新)到数据库中,因此当getB()
在第二个循环中被调用,保存“B”的任何内容都被更改并存在于数据库中。
我注意到的一件事是,在日志文件中,当我调用时,我没有看到提取“bar”数据的查询$foo->getBar()
在第二个循环中(这些应该被延迟加载)。另外,如果我var_dump()
返回值$foo->getBar()
在第二个循环中,它看起来与第一个循环结束时关联的“bar”对象完全相同。
我认为存在某种缓存或正在发生的事情(因为我在脚本执行的早期更改了这些“bar”对象,Doctrine 似乎只是重新使用这些对象,而不是从数据库重新加载它们的数据)。
我知道我想做的事情可能并不常见。我正在做的是使用 Symfony2 控制台命令功能编写一些命令行“守护进程”来帮助处理一些数据;包含此代码的“守护进程”与另一个处理创建的“bar”对象的“守护进程”一起运行。
好奇是否有办法在我调用时将其修复到第二个循环中的位置$foo->getBar()
方法,我实际上是从数据库中提取更新的数据。任何帮助是极大的赞赏。