Doctrine2 ORM nie odświeża obiektów, które zostały zmienione poza skryptem

Naprawdę nie wiedziałem, jak to nazwać lub poszukać już opublikowanego pytania, więc przepraszam, jeśli było to wcześniej widoczne tutaj.

Otrzymuję niepożądane wyniki z następującym kodem:

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

    }

}

Widać to w pierwszymwhile pętla,$bar obiekty są tworzone i umieszczane w bazie danych. Inny skrypt zbiera te informacje i robi z nimi różne rzeczy.

W sekundęwhile pętla,$foo obiekty próbują uzyskać dostęp do zmodyfikowanego obiektu „bar” (zwróć uwagę nagetB() będąc wywoływanym, możemy założyć, że w innym skrypcie wykonywanym oddzielniesetB() został użyty do zmiany stanu obiektu).

Jednak w drugiej pętli, gdy dzwonięgetB(), nie zwraca wartości, którą ustawiłemsetB() w tym innym skrypcie.

Mogę zapewnić, że wszystkie dane są prawidłowo utrwalane (i opróżniane) do bazy danych, więc kiedygetB() jest wywoływana w tej drugiej pętli, cokolwiek, co trzymało „B”, zostało zmienione i jest obecne w bazie danych.

Jedną z rzeczy, które zauważyłem, jest to, że w pliku dziennika nie widzę zapytania, aby pobrać dane dla „paska”, gdy dzwonię$foo->getBar() w drugiej pętli (powinny być ładowane leniwie). Także, jeśli javar_dump() wartość zwrócona z$foo->getBar() w drugiej pętli wygląda dokładnie tak, jakby skojarzony obiekt „bar” wyglądałby pod koniec pierwszej pętli.

Myślę, że istnieje jakiś rodzaj buforowania lub coś się dzieje (odkąd zmieniłem te obiekty „prętowe” w trakcie wykonywania skryptu, Doctrine wygląda na to, że po prostu używa ich ponownie, zamiast przeładowywać swoje dane z bazy danych ).

Wiem, że to, co próbuję zrobić, prawdopodobnie nie jest powszechne. Korzystam z funkcji komend konsoli Symfony2, aby napisać kilka „demonów” wiersza polecenia, aby pomóc w przetwarzaniu niektórych danych; „demon” zawierający ten kod jest uruchamiany w połączeniu z innym „demonem”, który przetwarza te utworzone na pasku obiekty.

Zastanawiasz się, czy istnieje sposób, aby to naprawić w mojej drugiej pętli, kiedy dzwonię do$foo->getBar() Metoda, faktycznie wyciągam zaktualizowane dane z bazy danych. Każda pomoc jest bardzo mile widziana.

questionAnswers(1)

yourAnswerToTheQuestion