Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Doctrine2和#x27;t刷新在脚本外部更改的对象_Php_Symfony_Doctrine Orm - Fatal编程技术网

Php Doctrine2和#x27;t刷新在脚本外部更改的对象

Php Doctrine2和#x27;t刷新在脚本外部更改的对象,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我真的不知道如何给这个标题或搜索一个已经发布的问题,所以如果以前在这里看到过,我很抱歉 我通过以下代码得到了一些不希望得到的结果: // get object managers $fooManager = $this->getContainer()->get('foo_manager'); $barManager = $this->getContainer()->get('bar_manager'); // infinite loop for (;;) { /

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

我通过以下代码得到了一些不希望得到的结果:

// 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\u dump()
,它看起来与第一个循环结束时关联的“bar”对象的外观完全相同

我认为存在某种缓存或正在发生的事情(因为我在脚本执行的早期更改了那些“bar”对象,所以看起来只是在重新使用它们,而不是从数据库中重新加载它们的数据)

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


奇怪的是,当我调用
$foo->getBar()
方法时,是否有办法将其修复到第二个循环中的某个位置,我实际上是在从数据库中提取更新的数据。非常感谢任何帮助。

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

例如:

$em->refresh($entity);

你试过这个吗<代码>$em->刷新($entity)谢谢!那确实有效。在过去的几个小时里,我一直在搜索,我在文档中所能找到的可能就是使用了
$em->detach($entity)的组合
$em->合并($entity),但这对我来说没什么意义。。。我在文档中没有看到任何关于
刷新($entity)
函数的内容。哇!!!谢谢我用它帮了我很多。谢谢!工作起来很有魅力!它实际上也帮了我很多忙!好的。