2011-12-22 11 views
5

Finora, penso che la dottrina non abbia un modo di selezionare una riga casuale. Così sto pensando Ho una domanda per ottenere il conteggio delle righeDoctrine 2 Selezione casuale di una riga (offset 0 o 1 indicizzato)?

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

Poi hanno una vera e propria query per ottenere la voce utilizzando un offset da PHP casuale messo in setFirstResult

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

domanda è, la mia rand() inizio da 0 o 1? Quindi la fine? $count o $count-1?

risposta

5

setFirstResult() è a base 0.

In seguito alla vostra approccio, è necessario utilizzare:

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

Fonte:

Sono d'accordo la documentazione non è chiara su questo punto. Tuttavia, possiamo vedere che Doctrine \ DBAL \ Query \ QueryBuilder usa in questo modo:

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

che viene poi tradotto a SQL in Dottrina \ DBAL \ Piattaforme \ AbstractPlatform:

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

OFFSET essere 0 Basato su SQL, possiamo dedurre che setFirstResult() sia anch'esso a base 0.

0

che uso nel mio app:

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

inizio a contare da 1 fino a quando il totale di record

+1

Seleziona una riga casuale? O intendevi che il primo risultato inizia da 1? Quindi per selezionare una riga casuale, farei '-> setMaxResults (1) -> setFirstResult (rand (1, $ count))'? –

+0

Voglio dire che il primo risultato è 1 e l'ultimo è il totale – rkmax

+0

Forse mi hai frainteso, voglio una * singola * riga casuale –

0

Non importa che si avvia da 0 o 1, si deve prendere la rispettiva fine a contare e contare -1 rispettivamente

+0

Scusa, cosa intendi? Penso che ci sia sicuramente una differenza se uso 0 o 1? –

+0

sì, c'è una differenza, l'interpretazione va avanti con il suo modo di specificare .. r8 .. ??? e quindi dipende dall'utilizzo di –

+0

cosa intendi con r8? –