Предотвращение кэша запросов Doctrine в Symfony - PullRequest
8 голосов
/ 07 февраля 2011

В моем приложении 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), но ни один из них не имел значения.

Любое понимание того, как предотвратить кэширование, так как я хочу, чтобы каждый раз при вызове этой функции выбиралась другая случайная строкаmethod?

Редактировать: Я также попытался вызвать 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 ]

4 голосов
/ 09 февраля 2011

Оказывается, я идиот. Я попытался упростить свой запрос на этот вопрос, и при этом я не уловил истинную причину. У меня был вызов where() и andWhere(), и комбинация условий привела к сопоставлению только одной возможной записи. Спасибо, что нашли время ответить всем, извините, что потратили впустую ваше время!

3 голосов
/ 31 марта 2011

Doctrine также кэширует сущности, созданные вами в ходе того же выполнения запроса / скрипта.

Например:

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

...