Предотвращение кэша запросов 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: добавлен этот ответ, потому что я нашел эту тему, пытающуюся решить вышеуказанную проблему.