2011-02-07 36 views
8

在我的Symfony /学说的应用程序,我有一个查询,通过随机的订单()。我多次调用同一个方法,但看起来查询的结果正在被缓存。防止主义的查询缓存中的Symfony

这里是我的相关代码:

$query = $table->createQuery('p') 
    ->select('p.*, RANDOM() as rnd') 
    ->orderBy('rnd') 
    ->limit(1) 
    ->useQueryCache(null) 
    ->useResultCache(null); 
$result = $query->fetchOne(); 

不幸的是,相同的记录返回每次,不管我路过nulluseQueryCacheuseResultCache。我尝试使用false而不是null,但那也没用。最后,我还打过电话都setResultCacheLifeSpan(0)setResultCacheLifeSpan(-1),但也调用了一定的作用。

如何防止缓存,因为我希望有一个不同的随机行每次我调用该方法时所选择的任何见解?

编辑:我也试着打电话clearResultCache(),但最终导致错误,说:“结果缓存驱动程序未初始化”。

编辑2:按照要求,这里是通过调用$query->getSqlQuery()生成的SQL:

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 
+0

嗨马特,你有没有试过`$查询 - > useResultCache(假)`? – Darmen 2011-02-07 05:24:32

+0

是的,我在我的问题中提到过我尝试使用false,但那也不起作用。 – 2011-02-07 14:27:46

回答

4

事实证明我是个白痴。我试图简化我对这个问题的查询,并且这样做,我没有捕获真正的原因。我有一个where()andWhere()调用,条件组合导致只有一个可能的记录相匹配。感谢您花时间回复,每个人,都很抱歉浪费您的时间!

2

学说还缓存您在相同的请求/脚本运行创建的实体。

例如:

$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:加这个答案,因为我发现这个话题,试图解决上述问题。