Doctrine2: Ordenar aleatoriamente

A veces queremos obtener objetos de la base de datos aleatoriamente, por ejemplo para que cada vez en portada hayan 3 artículos diferentes de una determinada categoría. Vamos a ver cómo hacer esto en Doctrine2.

Lo primero que podemos pensar es usar la función  RAND() para ordenar  ORDER BY RAND(), pero esto Doctrine2 no lo permite y tampoco se aconseja.

En mi caso cuando lo he tenido que hacer lo he hecho en tres pasos, primero obteniendo los ids que cumplen el criterio que quiero, luego ordenando los ids aleatoriamente y finalmente haciendo otra consulta para obtener los objetos asociados a esos ids. Para el ejemplo vamos a obtener las 2 ciudades españolas aleatoriamente. Empezamos por obtener los ids que cumplen este criterio:

Con esto obtenemos el siguiente array:

Vamos al siguiente paso en el que limpiamos el array dejándolo con los ids y lo limitamos:

En la primera parte limpiamos el array, si no hay resultados devolvemos un array vacío y si hay resultados mezclamos los ids y limitamos el número de ids. Finalmente obtenemos las ciudades:

El método completo sería:

Ver Demo