2011-12-22 9 views
5

Şimdiye kadar, doktrininin rastgele bir sıra seçmenin bir yolu olmadığını düşünüyorum. Bu yüzden bir sorgu var düşünüyorum satır sayısını almak içinDoctrine 2 Rastgele Bir Satır Seçme (Ofset 0 veya 1 endeksli)?

// pseudo code 
$count = SELECT COUNT(i) FROM Item i WHERE ... 

Sonra

$item = (SELECT i FROM Item WHERE ...)->setMaxResults(1)->setFirstResult(rand(0, $count))->getSingleResult() 

Soru olduğunu setFirstResult koymak PHP den ofset rastgele kullanarak öğeyi almak için gerçek bir sorgu var benim rand() 0 veya 1'den başlıyor muyum? Sonra son? $count veya $count-1? Benim uygulamada kullanmak

cevap

5

setFirstResult() 0-tabanlıdır. senin yaklaşımın ardından

, kullanmak zorunda:

->setFirstResult(rand(0, $count - 1))->setMaxResults(1)->getSingleResult(); 

Kaynak:

Kabul ediyorum dokümantasyon bu noktada belirsizdir. Ancak, biz Doktrin \ DBal \ Sorgu \ QueryBuilder bu şekilde kullandığını görebilirsiniz: sonra Doktrin \ DBal \ Platformları \ SQL için çevrilmiştir

->modifyLimitQuery($query, $this->maxResults, $this->firstResult); 

AbstractPlatform:

final public function modifyLimitQuery($query, $limit, $offset = null) 
{ 
    ... 
    $query .= ' OFFSET ' . $offset; 

OFFSET 0 olmanın SQL tabanlı, biz de setFirstResult() 0 tabanlı olduğu düşünülebilir.

0

:

$item = (SELECT i FROM Item WHERE ...) 
    ->setMaxResults($count) 
    ->setFirstResult(1)->getSingleResult(); 

başlangıç ​​kayıtları

+1

Bu rastgele bir sıra seçer mi? Yoksa ilk sonuç 1'den başlıyor mu demek istediniz? Bu yüzden rastgele bir satır seçmek için, -> setMaxResults (1) -> setFirstResult (rand (1, $ count)) 'yi kullanırdım? –

+0

Yani ilk sonuç 1 ve son toplam – rkmax

+0

Belki beni yanlış anlamışsın, ben * tek * rasgele sıra istiyorum –

0

0 olarak veya 1'den başlamak olursa olsun toplam dek 1'den saymak, saymak ve saymak için ilgili ucunu almalıdır -0- sırasıyla

+0

Üzgünüm, ne demek istiyorsun? 0 veya 1 kullanırsam kesinlikle bir fark olur mu? –

+0

evet, bir fark var, yorumlama kendi şartname yolu ile devam ediyor .. r8 .. ??? ve bu nedenle –

+0

kullanımına bağlıdır r8 ile ne demek istiyorsun? –