[英]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()
方法時,我是否有辦法將其解決到第二個循環中的位置,我實際上是從數據庫中提取更新的數據。 任何幫助是極大的贊賞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.