From 062fad434ad883ffc6f0c3798f2a490688199f3c Mon Sep 17 00:00:00 2001 From: Jeremy Benoist Date: Fri, 12 Oct 2018 21:41:28 +0200 Subject: [PATCH] Better random function --- .../CoreBundle/Repository/EntryRepository.php | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/Wallabag/CoreBundle/Repository/EntryRepository.php b/src/Wallabag/CoreBundle/Repository/EntryRepository.php index 6107e19ec..055630791 100644 --- a/src/Wallabag/CoreBundle/Repository/EntryRepository.php +++ b/src/Wallabag/CoreBundle/Repository/EntryRepository.php @@ -440,17 +440,14 @@ class EntryRepository extends EntityRepository * @throws \Doctrine\ORM\NoResultException * @throws \Doctrine\ORM\NonUniqueResultException * + * @see https://github.com/doctrine/doctrine2/issues/5479#issuecomment-403862934 + * * @return Entry */ public function getRandomEntry($userId, $status = '') { - $max = $this->getEntityManager() - ->createQuery('SELECT MAX(e.id) FROM Wallabag\CoreBundle\Entity\Entry e WHERE e.user = :userId') - ->setParameter('userId', $userId) - ->getSingleScalarResult(); - - $qb = $this->createQueryBuilder('e') - ->where('e.user = :user_id')->setParameter('user_id', $userId); + $qb = $this->getQueryBuilderByUser($userId) + ->select('MIN(e.id)', 'MAX(e.id)'); if ('unread' === $status) { $qb->andWhere('e.isArchived = false'); @@ -469,8 +466,15 @@ class EntryRepository extends EntityRepository $qb->andWhere('t.id is null'); } - return $qb->andWhere('e.id >= :rand') - ->setParameter('rand', rand(0, $max)) + $idLimits = $qb + ->getQuery() + ->getOneOrNullResult(); + $randomPossibleIds = rand($idLimits[1], $idLimits[2]); + + return $qb + ->select('e') + ->andWhere('e.id >= :random_id') + ->setParameter('random_id', $randomPossibleIds) ->setMaxResults(1) ->getQuery() ->getSingleResult();