Предотвращение кэша запросов Doctrine в Symfony
в моем приложении Symfony / Doctrine у меня есть запрос, который заказывает RANDOM(). Я вызываю этот же метод несколько раз, но похоже, что результат запроса кэшируется.
вот мой соответствующий код:
$query = $table->createQuery('p')
->select('p.*, RANDOM() as rnd')
->orderBy('rnd')
->limit(1)
->useQueryCache(null)
->useResultCache(null);
$result = $query->fetchOne();
к сожалению, одна и та же запись возвращается каждый раз, независимо от меня передает null
как useQueryCache
и useResultCache
. Я пробовал использовать false
вместо null
, но это не сработало. Наконец, я также попытался позвонить обоим setResultCacheLifeSpan(0)
и setResultCacheLifeSpan(-1)
, но ни один звонок не имел значения.
любое представление о том, как предотвратить кэширование, так как я хочу, чтобы при каждом вызове этого метода выбиралась другая случайная строка?
Edit: я также пытался позвонить clearResultCache()
, но это только что привело к ошибке: "драйвер кэша результата не инициализирован".
Edit 2: по запросу, вот SQL, созданный путем вызова $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
2 ответов
оказывается, я идиот. Я попытался упростить свой запрос для этого вопроса, и при этом я не уловил истинную причину. У меня был where()
и andWhere()
вызов, и сочетание условий привело к совпадению только одной возможной записи. Спасибо, что нашли время ответить, Все, извините, что потратили ваше время!
доктрина также кэширует объекты, созданные в том же запуске запроса/сценария.
например:
$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 не будет содержать изменений, внесенных во время сна.
следующий код удалит такой кэш памяти:
$manager = Doctrine_Manager::getInstance();
$connection = $manager->getCurrentConnection();
$tables = $connection->getTables();
foreach ( $tables as $table ) {
$table->clear();
}
PS: добавлен этот ответ, потому что я нашел эту тему, пытающуюся решить вышеуказанную проблему.