2011-02-07 54 views
8

'da Doktrinin sorgu önbelleğini önleme Symfony/Doctrine uygulamasında, RANDOM() tarafından verilen siparişlerin bir sorgusu var. Aynı yöntemi birkaç kez çağırıyorum, ancak sorgunun sonucu önbelleğe alınmış gibi görünüyor. Beni useQueryCache ve useResultCache hem null geçen bakılmaksızınSymfony

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

Maalesef aynı kayıt her seferinde döndürülür:

İşte benim alakalı kod. null yerine false kullanmayı denedim, ancak bu da işe yaramadı. Son olarak, hem setResultCacheLifeSpan(0) hem de setResultCacheLifeSpan(-1) numaralarını aramayı denedim, ancak ikisi de aramayı fark etmedi.

Bu yöntemi her aradığımda farklı bir rasgele satırın seçilmesini istediğim için önbelleğe almayı nasıl engelleyeceğine dair herhangi bir bilgi var mı?

Düzenleme: Ben de clearResultCache() aramaya çalıştım, ama bu sadece belirten bir hata neden sona erdi: "başlatılmamış Sonucu Önbellek sürücüsü".

Düzenleme 2: istenen gibi burada $query->getSqlQuery() arayarak oluşturulan SQL var:

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

Merhaba Matt, $ query-> useResultCache (false) 'yi denediniz mi? – Darmen

+0

Evet, sorduğum soruda yanlış kullanmayı denedim, ama bu da işe yaramadı. –

+1

Sorgu önbelleğini neden devre dışı bırakalım? Sorgu aynı kalıyor! Sadece sonuç önbelleğini temizlemeniz yeterlidir. Belki de DBMS önbelleğinizi alıyorsunuz ... her istek için bir sorgulama yapılıp yapılmadığını görmek için sorguları kaydedebilirsiniz. – greg0ire

cevap

4

Öyle bir aptalım çıkıyor. Bu soru için sorgumu basitleştirmeyi denedim ve bunu yaparken gerçek sebebi yakalamadım. where() ve andWhere() numaralı bir aramam vardı ve koşulların birleşmesiyle eşleşen tek bir kayıt elde edildi. Yanıt vermek için zaman ayırdığınız için teşekkür ederiz, herkese zamanınızı boşa harcadığım için üzgünüm!

2

Doctrine, aynı istekte/komut dosyası çalıştırmasında oluşturduğunuz öğeleri de önbelleğe alır. Örneğin

:

$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 Eğer uyku sırasında yapılan değişiklikleri içermez.

$manager = Doctrine_Manager::getInstance(); 
$connection = $manager->getCurrentConnection(); 
$tables = $connection->getTables(); 
foreach ($tables as $table) { 
    $table->clear(); 
} 

PS: Ben konuya yukarıda çözmeye çalışırken bu konuyu buldum çünkü bu cevabı Eklenen

Aşağıdaki kod önbellek bu tür kaldıracaktır.

+0

Çok iyi bir açıklama. –

+0

Bu benim için gerçekten yararlı oldu ve açıklama için teşekkürler. – Thilanka