¿Cómo fuerzo a doctrine a recargar los datos de la base de datos?


Estoy usando doctrine/mongodb 1.0.0-BETA1 en una instalación de symfony2.1.

Así que estoy tratando de forzar a mi repositorio a llamar a datos de mi base de datos en lugar de usar el objeto que tiene almacenado en caché.

$audit = $dm->getRepository("WGenSimschoolsBundle:Audit")->findOneById("xxxx");

.... do something somewhere to change the object ....

En este punto si llamo

$audit = $dm->getRepository("WGenSimschoolsBundle:Audit")->findOneById("xxxx");

Los datos de auditoría no han cambiado. Todavía tiene el objeto que originalmente obtuvo. Si intento

$dm->refresh($audit) 

Me pasa lo mismo. ¿Hay de todos modos para mí para volver a la base de datos para el valor?

Author: daSn0wie, 2013-02-08

6 answers

¿Has vaciado tus cambios en el objeto $audit?

$audit = $dm->getRepository("WGenSimschoolsBundle:Audit")->findOneById("xxxx");
//do something somewhere to change the object
$dm->flush();

Cada vez que haces un findBy(...) o findOneBy(...) realmente obtiene un nuevo documento de la base de datos. (debería ver la consulta en Symfony profiler)

Con un find() en su lugar, obtendrá el documento desde su caché interna del proxy. Los documentos permanecen en la caché del proxy hasta que llame al método $dm->clear().

 44
Author: Madarco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-04 21:19:18

Esto funcionó para mí:

$doc = $this->documentManager->getRepository('MyBundle:MyDoc')->find($id);

/* ... in the meanwhile another external process is doing some changes to the object ...*/
$doc = $this->documentManager->getRepository('MyBundle:MyDoc')->find($id); // Perhaps this is not useful
$this->documentManager->refresh($doc);
 21
Author: fdellutri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-28 17:24:13

Añadiendo a las respuestas anteriores, estaba buscando cómo actualizar la base de datos de un Entity, no de un Document pero la solución estaba cerca. Lo estoy publicando aquí para otros tropezando en esta página con el mismo problema.

En una de mis pruebas funcionales, estaba usando dos veces la misma consulta:

$em = $kernel->getContainer()->get('doctrine.orm.entity_manager');
$user = $em->getRepository('AcmeUserBundle:User')->findOneBy(array('email' => '[email protected]'));
echo "Old hash: ".$user->getPassword() . "\n";
// result: 8bb6118f8fd6935ad0876a3be34a717d32708ffd

Luego las pruebas pasan por un proceso de cambio de contraseña. Luego volví a preguntar al usuario para comparar si el hash de la contraseña había cambiado con el mismo consulta:

$user = $em->getRepository('AcmeUserBundle:User')->findOneBy(array('email' => '[email protected]'));
echo "New hash: ".$user->getPassword() . "\n";
// result: 8bb6118f8fd6935ad0876a3be34a717d32708ffd # Same !

El problema era que a pesar de que el controlador probado actualizaba el hash, el entity manager tenía la entidad en cache.

Entonces, la solución fue agregar lo siguiente entre las dos consultas:

$em->clear();

Y ahora, el hash de contraseña cambió entre las consultas ! Yay !

 16
Author: achedeuzot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-13 14:26:45

Al tratar con entidades relacionadas, si modifica las entidades relacionadas y las guarda a través del objeto padre, tendrá que agregar una opción cascade={"detach"} para que la separación sea efectiva.

Por ejemplo, supongamos que desea actualizar una lista de Amigos en un objeto Person, agregando nuevos objetos a la lista, eliminando algunos de ellos y actualizando algunos existentes. Vas a tener

$em->flush();
$em->detach($entity);

Y en su entidad Persona asegúrese de actualizar su relación de amigos :

@ORM\OneToMany(targetEntity="Somewhere\PeopleBundle\Entity\Person", mappedBy="person", cascade={"detach"})
private $friends;
 2
Author: vbourdeix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-31 09:53:58

Puede usar el método refresh:

$post; # modified
$entityManager->refresh();
$post; # reset from db
 2
Author: حمید,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-19 21:58:42

Intenta algo como

$dm->getUnitOfWork()->clear('WGenSimschoolsBundle:Audit');
 0
Author: ryabenko-pro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-10 13:37:23