Foros del Web » Programando para Internet » PHP » Symfony »

Random Doctrine

Estas en el tema de Random Doctrine en el foro de Symfony en Foros del Web. Hola, no se me ocurre una manera de obtener registros aleatorios (sin recurrir a SQL di base) usando Doctrine. hasta ahora solo se me ocurre ...
  #1 (permalink)  
Antiguo 02/06/2012, 20:11
Avatar de Ribon  
Fecha de Ingreso: septiembre-2010
Ubicación: El firmamento
Mensajes: 487
Antigüedad: 14 años, 2 meses
Puntos: 91
Random Doctrine

Hola, no se me ocurre una manera de obtener registros aleatorios (sin recurrir a SQL di base) usando Doctrine.

hasta ahora solo se me ocurre traer TODOS los registros y luego de tenerlos almacenado en una colección usar shuffle y luego traer los primeros registros
enfermando un poquito la memoria del servidor

Alguien tiene por ahí una manera mejor de hacerlo?
Gracias por adelantado :P
__________________
Utilice el Highlight para mostrar código, mis ojos se lo agradecerán :)
qué es esto? :O -> http://i48.tinypic.com/5x3kzs.png
Ya sabes :)
  #2 (permalink)  
Antiguo 02/06/2012, 22:37
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Random Doctrine

Es que no hay mucha vuelta, o lo haces a nivel de SQL/DQL o a nivel de PHP, este último implica tener la colección completa en memoria, lo que no entiendo es porque evitar lo mas lógico(SQL + DQL).

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 03/06/2012, 14:32
Avatar de Ribon  
Fecha de Ingreso: septiembre-2010
Ubicación: El firmamento
Mensajes: 487
Antigüedad: 14 años, 2 meses
Puntos: 91
Respuesta: Random Doctrine

DQL no implementa el ordenar por función

p.e. ORDER BY RAND() de MySQL

que podría servirme en este caso

no quiero recurrir a hacerlo con SQL ya que quiero que mi aplicación sea portable entre motores de BD :P y para hacerlo en los distintos motores la query cambia =(

Lo que podría hacer es poner una colección de SQL y dependiendo del motor se haga la correspondiente :C
__________________
Utilice el Highlight para mostrar código, mis ojos se lo agradecerán :)
qué es esto? :O -> http://i48.tinypic.com/5x3kzs.png
Ya sabes :)
  #4 (permalink)  
Antiguo 03/06/2012, 14:44
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Random Doctrine

Cita:
Iniciado por Ribon Ver Mensaje
DQL no implementa el ordenar por función
Lo se, por eso te comento de SQL + DQL, por lo general se hace un SQL para obtener los id's en random y luego DQL para cargar las entities relacionadas a los id's y que tenga que tirar SQL no quiere decir que no sea portable, simplemente tienes que trabajarlo un poco mas(abstraer la query para que se genere según el engine).

Edit: Otra opcion seria generar custom functions y hacer el load de las mismas dependiendo del engine.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 03/06/2012, 17:05
Avatar de Ribon  
Fecha de Ingreso: septiembre-2010
Ubicación: El firmamento
Mensajes: 487
Antigüedad: 14 años, 2 meses
Puntos: 91
Respuesta: Random Doctrine

Tu dices algo como

Código PHP:
Ver original
  1. case 'mysql':
  2. SELECT id FROM tabla WHERE condiciones ORDER BY RAND() limit 5;
  3. case 'postgreSQL':
  4. SELECT id FROM tabla WHERE condiciones ORDER BY RANDOM() limit 5;
  5. case 'MSSQL':
  6. SELECT TOP 5 id FROM tabla WHERE condiciones ORDER BY NEWID();
  7. .
  8. .
  9. .

Ejecutarla

y los resultados de ese query pasarlos al DQL en un IN() ??

Eso entendí :P o te refieres a otra manera? c.c
__________________
Utilice el Highlight para mostrar código, mis ojos se lo agradecerán :)
qué es esto? :O -> http://i48.tinypic.com/5x3kzs.png
Ya sabes :)

Etiquetas: symfony2
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:40.