簡體   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