Doctrine2 ORM no actualiza los objetos que se modifican fuera de un script
Realmente no sabía cómo titular esto o buscar una pregunta ya publicada, así que mis disculpas si esto se ha visto aquí antes.
Estoy obteniendo algunos resultados no deseados con el siguiente código:
// 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());
}
}
Se puede ver que en la primera.while
lazo,$bar
Los objetos se hacen y se ponen en la base de datos. Otro guión es recogerlos y hacerles cosas.
En el segundowhile
bucle, el$foo
los objetos están tratando de acceder a su objeto "barra" modificado (observe elgetB()
Al ser llamado, podemos asumir que en otro script se ejecuta por separado.setB()
se utilizó para cambiar el estado del objeto).
Sin embargo, en el segundo bucle, cuando llamogetB()
, no está devolviendo el valor que configuré consetB()
en ese otro guión.
Puedo asegurar que todos los datos se conserven (y se vacían) correctamente en la base de datos, por lo que cuandogetB()
En ese segundo bucle se llama, todo lo que contenía "B" se cambió y está presente en la base de datos.
Una cosa que he notado es que en el archivo de registro, no veo una consulta para obtener los datos de "barra" cuando llamo$foo->getBar()
en el segundo bucle (estos deben ser cargados perezosamente). Además, si yovar_dump()
el valor devuelto de$foo->getBar()
en el segundo bucle, se ve exactamente como se vería el objeto "barra" asociado al final del primer bucle.
Estoy pensando que hay algún tipo de almacenamiento en caché o algo que está sucediendo (ya que modifiqué esos objetos de "barra" anteriormente en la ejecución del script, Doctrine parece que simplemente está reutilizando esos en lugar de recargar sus datos de la base de datos. ).
Sé que lo que estoy tratando de hacer probablemente no sea común. Lo que estoy haciendo es usar las funciones del comando de la consola de Symfony2 para escribir algunos "demonios" de la línea de comandos para ayudar a procesar algunos datos; el "demonio" que contiene este código se ejecuta junto con otro "demonio" que procesa los objetos "de barra" que se crean.
Tengo curiosidad por saber si hay una manera de solucionar esto en mi segundo bucle cuando llamo al$foo->getBar()
Método, en realidad estoy extrayendo los datos actualizados de la base de datos. Cualquier ayuda es muy apreciada.