2011-12-22 9 views
5

Hasta ahora, creo que la doctrina no tiene una forma de seleccionar una fila aleatoria. Así que estoy pensando que tengo una consulta para obtener el recuento de filasDoctrine 2 Selección aleatoria de una fila (Compensación 0 o 1 indexada)?

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

Entonces tiene una consulta real para conseguir el artículo usando un desplazamiento aleatorio de PHP poner en setFirstResult

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

La pregunta es, mi rand() ¿comienzo desde 0 o 1? Entonces el final? $count o $count-1?

Respuesta

5

setFirstResult() está basado en 0.

Siguiendo su enfoque, usted tiene que utilizar:

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

Fuente:

Acepto la documentación no está claro en ese punto. Sin embargo, podemos ver que la Doctrina \ DBAL \ query \ QueryBuilder utiliza de esa manera:

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

que se traduce entonces a SQL en Doctrina \ DBAL \ Plataformas \ AbstractPlatform:

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

OFFSET siendo 0 -basado en SQL, podemos deducir que setFirstResult() también está basado en 0.

0

que utilizo en mi aplicación:

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

principio a contar desde 1 hasta que el total de registros

+1

¿Esto selecciona una fila al azar? ¿O quiso decir que el primer resultado comienza desde 1? Entonces, para seleccionar una fila al azar, haría '-> setMaxResults (1) -> setFirstResult (rand (1, $ count))'? –

+0

Quiero decir que el primer resultado es 1 y el último es el total de – rkmax

+0

Quizás me malentendió, quiero una * al azar * fila –

0

No importa de empezar desde 0 o 1, usted debe tomar el extremo respectivo de contar y contar -1 respectivamente

+0

Lo siento, ¿qué quieres decir? Creo que definitivamente hay una diferencia si uso 0 o 1? –

+0

sí, hay una diferencia, la interpretación continúa con su propia forma de especificación..r8 .. ??? y por lo tanto depende del uso –

+0

¿qué quiere decir con r8? –

Cuestiones relacionadas