5

我真的不知道如何命名或搜索已经发布的问题,所以如果之前在这里看到过,我深表歉意。

使用以下代码,我得到了一些不希望的结果:

// 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()在第二个循环中调用

我注意到的一件事是,在日志文件中,当我在第二个循环中调用时,我没有看到一个查询来提取“bar”的数据$foo->getBar()(这些应该是延迟加载的)。此外,如果我var_dump()从第二个循环中返回的值$foo->getBar(),它看起来与关联的“bar”对象在第一个循环结束时看起来完全一样。

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

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

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

4

1 回答 1

28

This was really provided by the user ChocoDeveloper. Making use of the refresh($entity) method on the entity manager solved my problem.

For example:

$em->refresh($entity);
于 2013-03-24T12:56:33.800 回答