ORM Doctrine2 ne pas actualiser les objets qui sont modifiées à l'extérieur d'un script

Je ne savais vraiment pas comment le titre de cette ou de recherche pour un a déjà posté la question, donc toutes mes excuses si cela a été vu avant.

J'obtiens des résultats indésirables avec le code suivant:

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

    }

}

Vous pouvez voir que dans le premier while boucle, $bar des objets et les mettre dans la base de données. Un autre script est ramasser sur ces et faire des choses pour eux.

Dans la deuxième while boucle, le $foo objets sont tentant d'accéder à leurs modifié "bar" de l'objet (avis de l' getB() être appelé, on peut supposer que dans un autre script exécuté séparément setB() a été utilisé pour modifier l'état de l'objet).

Cependant, dans la seconde boucle, quand je l'appelle getB(), il n'est pas de retourner la valeur que j'ai mis avec setB() dans cet autre script.

Je peux vous assurer que toutes les données soient correctement maintenue (et rouges) à la base de données, de sorte que lorsque le getB() est appelé dans cette deuxième boucle, ce qui a été enfoncée la touche "B" a été changé et est présent dans la base de données.

Une chose que j'ai remarqué, c'est que dans le fichier journal, je ne suis pas le voir d'une requête pour extraire les données pour "bar" quand je l'appelle $foo->getBar() dans la deuxième boucle (ceux-ci devraient être paresseusement chargé). Aussi, si je var_dump() la valeur retournée par $foo->getBar() dans la deuxième boucle, il ressemble exactement à l'associées "bar" objet aurait l'air d'ici la fin de la première boucle.

Je pense qu'il y a une sorte de mise en cache ou quelque chose à faire (depuis que j'ai modifié ces "barre" des objets de plus haut dans le script d'exécution, la Doctrine semble qu'il est juste de ré-utilisation, plutôt que de recharger leurs données à partir de la base de données).

Je sais ce que je suis en train de faire est probablement pas commun. Ce que je fais est à l'aide de la console Symfony2 fonctionnalités de commande à écrire quelques ligne de commande "démons" pour aider avec le traitement de certaines données; le "démon" qui contient ce code est en cours d'exécution en collaboration avec un autre "démon" qui traite de ces "barre" des objets créés.

Curieux de savoir si il existe un moyen de résoudre ce problème d'où, dans ma deuxième boucle quand j'appelle le $foo->getBar() méthode, je suis en tirant la mise à jour des données de la base de données. Toute aide est grandement appréciée.

  • Avez-vous essayé? $em->refresh($entity);
  • Merci! Qui a fait un travail. J'ai passé les dernières heures à la recherche et tout ce que je pouvais trouver dans les docs n'était peut-être en utilisant une combinaison de $em->detach($entity); et $em->merge($entity);, mais ce n'était pas de faire beaucoup de sens pour moi... Nulle part je n'ai vu dans les docs n'importe quoi sur un refresh($entity) fonction.