2011-02-07 42 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:加這個答案,因爲我發現這個話題,試圖解決上述問題。