Ya sea para aprender algo nuevo o simplemente porque necesitamos seleccionar elementos aleatorios, registros de una tabla en nuestra base de datos y no tenemos tiempo para implementar una nueva función de Doctrine ( Rand en este caso que no se implementa típicamente en dql), esto La tarea puede volverse complicada si no usamos las funciones correctas.
En MySql puede usar el siguiente código para seleccionar filas aleatorias de una tabla fácilmente:
SELECT column FROM table
ORDER BY RAND()
LIMIT 10
Pero si usa DQL (Doctrine Query Language) esto no será tan fácil. De acuerdo con la documentación, puede implementar una extensión de doctrina y agregar la instrucción RAND a nuestras consultas (en este artículo, no manejaremos esto porque esa es otra historia y otro dolor de cabeza) pero resolveremos este problema fácil y rápidamente solo con un par de las líneas en su lugar agregan clases enteras a nuestro proyecto.
Para nuestra solución, usaremos la instrucción where IN y simplemente buscaremos por algún término (en este caso, ID o cualquier campo autoincremental, si su tabla no tiene una clave primaria con autoincremental, debe implementar la extensión RAND de doctrine ) según números aleatorios con una función php simple.
En este ejemplo, la tabla que usaremos tendrá un campo autoincremental llamado id (que tiene valores numéricos ...), para recuperar registros aleatorios necesitamos crear primero una función que devuelva números aleatorios con un rango dado (el valor inicial , el valor máximo y la cantidad) como el siguiente:
function UniqueRandomNumbersWithinRange($min, $max, $quantity) {
$numbers = range($min, $max);
shuffle($numbers);
return array_slice($numbers, 0, $quantity);
}
UniqueRandomNumbersWithinRange nos dará números aleatorios entre el rango dado, esos números se usarán para buscar filas aleatorias en nuestra tabla con una doctrina como esta:
$em = $this->getDoctrine()->getManager();
$repo = $em->getRepository('mybundleBundle:TableName');
$quantity = 5; // Solo queremos 5 filas (sin embargo, piense en aumentar este valor si anteriormente ha eliminado filas en la tabla)
// Este es el número de filas en la base de datos
// Puedes utilizar otro método según tus necesidades
$totalRowsTable = $repo->createQueryBuilder('a')->select('count(a.id)')->getQuery()->getSingleScalarResult();//Esto será en este caso 10 porque tengo 10 registros en esta tabla
$random_ids = UniqueRandomNumbersWithinRange(1,$totalRowsTable,$quantity);
// var_dump($random_ids);
// imprime por ejemplo:
// array(1,5,2,8,3);
$random_articles = $repo->createQueryBuilder('a')
->where('a.id IN (:ids)') // if is another field, change it
->setParameter('ids', $random_ids)
->setMaxResults(3)// Agregue esta línea si desea dar un límite a los registros (si existen todos los identificadores, entonces le gustaría dar un límite)
->getQuery()
->getResult();
La estructura del código anterior es bastante fácil, WHERE IN coincidirá con las filas cuyas identificaciones están en $ random_ids (matriz). Puede cambiar el método para obtener el total de filas en su base de datos (u obtener la identificación del último registro de acuerdo con el uso de su tabla) si es necesario. La parte más importante es dónde en la línea, puede probar con números aleatorios para ver si funciona antes de implementar la solución completa. Que te diviertas ❤️!
Conviertete en un programador más sociable