Wiele razy podczas tworzenia portali opartych o Symfony zachodziła potrzeba by zrandomizować wyniki pobierane z bazy danych. Niestety doctrine w swoim standardzie nie ma wbudowanych takich funkcji jak RAND(), MAX(), MIN() czy bardzo często pożądany DAY(). Co więcej, próżno szukać zwięzłej i precyzyjnej odpowiedzi na przedstawiony problem nawet w dokumentacji Symfony i Doctrine. Na ratunek przychodzi DoctrineExtensions.
Instalacja jest bardzo prosta.
W katalogu głównym naszego projektu roboczego wywołujemy żądanie do composera
composer require beberlei/DoctrineExtensions
Następnie po przejsciu do katalogu app/config/config.yml, definiujemy nasze funkcje w następujący sposób:
doctrine:
orm:
dql:
numeric_functions:
rand: DoctrineExtensions\Query\Mysql\Rand
Sam kod PHP może natomiast wyglądać następująco:
$movie = $this->getDoctrine()
->getEntityManager()
->createQueryBuilder('v')
->select('m')
->from('AppBundle:Movie', 'm')
->orderBy('RAND()')
->getQuery()
->setMaxResults(4)
->getResult();