caching - cache - Prevención del caché de consultas de Doctrine en Symfony
symfony cache (2)
Resulta que soy un idiota. Traté de simplificar mi consulta para esta pregunta, y al hacerlo, no capturé la verdadera causa. Tuve una llamada a where()
y andWhere()
, y la combinación de condiciones resultó en un solo registro posible coincidente. Gracias por tomarse el tiempo para responder, todos, ¡siento haber perdido su tiempo!
En mi aplicación Symfony / Doctrine, tengo una consulta que ordena por RANDOM (). Llamo a este mismo método varias veces, pero parece que el resultado de la consulta se almacena en caché.
Aquí está mi código relevante:
$query = $table->createQuery(''p'')
->select(''p.*, RANDOM() as rnd'')
->orderBy(''rnd'')
->limit(1)
->useQueryCache(null)
->useResultCache(null);
$result = $query->fetchOne();
Desafortunadamente, el mismo registro se devuelve cada vez, independientemente de que pase null
a useQueryCache
y useResultCache
. Intenté usar false
lugar de null
, pero tampoco funcionó. Por último, también intenté llamar a setResultCacheLifeSpan(0)
y setResultCacheLifeSpan(-1)
, pero ninguna de las dos marcó una diferencia.
¿Alguna idea sobre cómo evitar el almacenamiento en caché ya que quiero que se seleccione una fila aleatoria diferente cada vez que llamo a este método?
Editar: También intenté llamar a clearResultCache()
, pero eso acaba provocando un error que indica: "El controlador de caché de resultados no se ha inicializado".
Editar 2: según lo solicitado, aquí está el SQL generado llamando a $query->getSqlQuery()
:
SELECT c.id AS c__id, c.name AS c__name, c.image_url AS c__image_url,
c.level AS c__level, c.created_at AS c__created_at, c.updated_at
AS c__updated_at, RANDOM() AS c__0 FROM cards c ORDER BY c__0 LIMIT 1
Doctrine también almacena en caché las entidades que creó en la misma ejecución de solicitud / script.
Por ejemplo:
$order = new Order();
$order->save();
sleep(10); // Edit this record in de DB in another procces.
$q = new Doctrine_Query();
$result = $q->select()
->from(''Order o'')
->where(''o.id = ''.$order->id);
$order = $result->getFirst();
print_r($order->toArray());
Print_r no contendrá los cambios que realizó durante la suspensión.
El siguiente código eliminará ese tipo de memoria caché:
$manager = Doctrine_Manager::getInstance();
$connection = $manager->getCurrentConnection();
$tables = $connection->getTables();
foreach ( $tables as $table ) {
$table->clear();
}
PD: Agregué esta respuesta porque encontré este tema tratando de resolver el problema anterior.