Doctrine ne permet pas par défaut d’obtenir un enregistrement aléatoire, ce qui est pourtant en principe très simple avec mysql. Par contre il est possible de faire une requête native et de demander a doctrine de « mapper » les résultats. Il devient alors facile de récupérer notre enregistrement aléatoire sous le format habituel (entité doctrine). Voici ci-dessous la méthode d’un repository permettant de la faire.
class ExempleRepository extends \Doctrine\ORM\EntityRepository {
public function findRandom() {
$rsm = new \Doctrine\ORM\Query\ResultSetMappingBuilder($this->getEntityManager());
$rsm->addRootEntityFromClassMetadata(\AppBundle\Entity\Exemple::class, 'exemple');
$sql = "SELECT * FROM exemple ORDER BY RAND() LIMIT 1";
return $this->getEntityManager()->createNativeQuery($sql, $rsm)->getOneOrNullResult();
}
}
public function findRandom() {
$rsm = new \Doctrine\ORM\Query\ResultSetMappingBuilder($this->getEntityManager());
$rsm->addRootEntityFromClassMetadata(\AppBundle\Entity\Exemple::class, 'exemple');
$sql = "SELECT * FROM exemple ORDER BY RAND() LIMIT 1";
return $this->getEntityManager()->createNativeQuery($sql, $rsm)->getOneOrNullResult();
}
}