Doctrine2 ORM aktualisiert keine Objekte, die außerhalb eines Skripts geändert wurden

Ich wusste wirklich nicht, wie ich das benennen oder nach einer bereits geposteten Frage suchen sollte, also entschuldige ich mich, wenn dies hier schon einmal gesehen wurde.

Ich erhalte einige unerwünschte Ergebnisse mit dem folgenden Code:

// 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());

    }

}

Sie können das im ersten sehenwhile Schleife,$bar Objekte werden erstellt und in die Datenbank gestellt. Ein anderes Skript greift diese auf und macht Dinge mit ihnen.

In dieser Sekundewhile Schleife, die$foo Objekte versuchen, auf ihr geändertes "Balken" - Objekt zuzugreifen (beachten Sie diegetB() Beim Aufruf können wir davon ausgehen, dass in einem anderen Skript separat ausgeführt wirdsetB() wurde verwendet, um den Status des Objekts zu ändern).

Allerdings in der zweiten Schleife, wenn ich anrufegetB()gibt den von mir eingestellten Wert nicht zurücksetB() in diesem anderen Skript.

Ich kann sicherstellen, dass alle Daten ordnungsgemäß in der Datenbank gespeichert (und gelöscht) werdengetB() wird in dieser zweiten Schleife aufgerufen, was auch immer "B" gehalten hat, wurde geändert und ist in der Datenbank vorhanden.

Eine Sache, die mir aufgefallen ist, ist, dass in der Protokolldatei keine Abfrage zum Einlesen der Daten für "bar" angezeigt wird, wenn ich anrufe$foo->getBar() in der zweiten Schleife (diese sollten träge geladen werden). Auch wenn ichvar_dump() Der von zurückgegebene Wert$foo->getBar() In der zweiten Schleife sieht es genauso aus, als würde das zugehörige "Balken" -Objekt bis zum Ende der ersten Schleife aussehen.

Ich denke, dass es eine Art Zwischenspeicherung oder ähnliches gibt (da ich diese "Balken" -Objekte früher in der Skriptausführung geändert habe, scheint Doctrine diese nur wiederzuverwenden, anstatt ihre Daten aus der Datenbank neu zu laden ).

Ich weiß, was ich versuche, ist wahrscheinlich nicht üblich. Ich verwende die Symfony2-Konsolenbefehlsfunktionen, um einige Befehlszeilen- "Daemons" zu schreiben, die bei der Verarbeitung einiger Daten helfen. Der "Daemon", der diesen Code enthält, wird zusammen mit einem anderen "Daemon" ausgeführt, der die "Balken" -Objekte verarbeitet, die erstellt werden.

Neugierig, ob es eine Möglichkeit gibt, dies in meiner zweiten Schleife zu beheben, wenn ich die aufrufe$foo->getBar() Methode ziehe ich tatsächlich die aktualisierten Daten aus der Datenbank. Jede Hilfe wird sehr geschätzt.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage