繁体   English   中英

Doctrine2 ORM不会刷新在脚本之外更改的对象

[英]Doctrine2 ORM doesn't refresh objects that are altered outside of a script

我真的不知道如何标题或搜索已经发布的问题,所以我很抱歉,如果以前在这里看过。

我使用以下代码获得了一些不良结果:

// 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()时,我没有看到为“bar”提取数据的查询(这些应该是延迟加载)。 另外,如果我在第二个循环中从$foo->getBar()返回值var_dump() ,它看起来与第一个循环结束时关联的“bar”对象看起来完全一样。

我认为存在某种缓存或某些事情(因为我在脚本执行的早期更改了那些“bar”对象,Doctrine似乎只是重用它们而不是从数据库重新加载它们的数据)。

我知道我想要做的事情可能不常见。 我正在做的是使用Symfony2控制台命令功能编写一些命令行“守护进程”来帮助处理一些数据; 包含此代码的“守护进程”与另一个“守护进程”一起运行,该守护进程处理创建的那些“bar”对象。

当我调用$foo->getBar()方法时,我是否有办法将其解决到第二个循环中的位置,我实际上是从数据库中提取更新的数据。 任何帮助是极大的赞赏。

这实际上是由用户ChocoDeveloper提供的。 在实体管理器上使用refresh($entity)方法解决了我的问题。

例如:

$em->refresh($entity);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM