如何从数据库中获取随机条目?
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;
我需要从数据库中随机获取一条记录。我是怎么做到的:
$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;