如何从数据库中获取随机条目?

how to get random entry from db?

我需要从数据库中随机获取一条记录。我是怎么做到的:

$qb = $this->createQueryBuilder('article');
$totalRowsTable = $qb->select('count(article.id)')->getQuery()->getSingleScalarResult();
var_dump($totalRowsTable);

$random = (int)max(0, rand(1, $totalRowsTable));
var_dump($random);

$qb = $this->createQueryBuilder('article')
     ->andWhere("article.id IN (:id)")
     ->setParameter('id', $random)
     ->setMaxResult(1);
return $qb->getQuery()->getResult();

我不明白为什么函数 returns 为零。如何以更正确的方式从数据库中获取随机记录?

$idArticle = $this->createQueryBuilder('article')
            ->select('MIN(article.id)', 'MAX(article.id)')
            ->getQuery()
            ->getOneOrNullResult();
        $random = rand($idArticle[1], $idArticle[2]);

        return $this->createQueryBuilder('article')
            ->where('article.id >= :randomId')
            ->setParameter('randomId', $random)
            ->setMaxResults(1)
            ->getQuery()
            ->getResult();

我认为这可能是您问题的正确答案。

首先,我们必须通过执行以下代码来计算 table 中的行数:

$queryBuilder = $this->createQueryBuilder('article');
$count = $queryBuilder
    ->select('COUNT(article.id)')
    ->getQuery()
    ->getSingleScalarResult();

接下来,我们要计算从0到$count的随机值。 但是函数 rand or even mt_rand 不够安全,不能使用,因为:

Caution This function does not generate cryptographically secure values, and should not be used for cryptographic purposes. If you need a cryptographically secure value, consider using random_int(), random_bytes(), or openssl_random_pseudo_bytes() instead.

代替我们应该使用的例子函数random_int。 因此,为了选择安全的随机值,我们实现了以下代码:

$offset = random_int(0, max(0, $count - 1));

至少,我们可以检索 table 的随机行记录:

return $this->createQueryBuilder('article')
    ->setFirstResult($offset)
    ->setMaxResult(1)
    ->getOneOrNullResult;