jzi*_*011 5 php symfony doctrine-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());
}
}
Run Code Online (Sandbox Code Playgroud)
您可以看到,在第一个while循环中,$bar正在创建对象并将其放入数据库.另一个脚本正在接受这些并为他们做事.
在第二个while循环中,$foo对象试图访问其修改后的"bar"对象(注意getB()被调用,我们可以假设在另一个单独执行的脚本中setB()用于更改对象的状态).
但是,在第二个循环中,当我调用时getB(),它没有返回我setB()在其他脚本中设置的值.
我可以确保所有数据都被正确地持久化(并刷新)到数据库中,因此当getB()在第二个循环中调用时,保持"B"的任何内容都被更改并存在于数据库中.
我注意到的一件事是,在日志文件中,当我$foo->getBar()在第二个循环中调用时,我没有看到为"bar"提取数据的查询(这些应该是延迟加载).此外,如果我在第二个循环中var_dump()返回的值$foo->getBar(),它看起来与第一个循环结束时关联的"bar"对象看起来完全相同.
我认为存在某种缓存或某些事情(因为我在脚本执行的早期更改了那些"bar"对象,Doctrine似乎只是重用它们而不是从数据库重新加载它们的数据).
我知道我想要做的事情可能不常见.我正在做的是使用Symfony2控制台命令功能编写一些命令行"守护进程"来帮助处理一些数据; 包含此代码的"守护进程"与另一个"守护进程"一起运行,该守护进程处理创建的那些"bar"对象.
好奇是否有一种方法可以解决这个问题,当我调用$foo->getBar()方法时,我在第二个循环中的位置,实际上是从数据库中提取更新的数据.任何帮助是极大的赞赏.
jzi*_*011 25
这实际上是由用户ChocoDeveloper提供的.refresh($entity)在实体管理器上使用该方法解决了我的问题.
例如:
$em->refresh($entity);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11599 次 |
| 最近记录: |