Мне нужно получить случайную запись из базы данных. Как я это делаю:
$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();
Я не понимаю, почему функция возвращает ноль. Как мне более корректно получить случайную запись из базы данных?
Количество записей не обязательно совпадает с идентификаторами ваших строк данных. то есть ваши идентификаторы строк могут начинаться с 10000, но у вас есть только 50 записей. Тогда ты никогда не получишь результат.






$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();
Я думаю, что это может быть правильным ответом на ваши вопросы.
Прежде всего, нам нужно рассчитать количество строк в таблице, выполнив следующий код:
$queryBuilder = $this->createQueryBuilder('article');
$count = $queryBuilder
->select('COUNT(article.id)')
->getQuery()
->getSingleScalarResult();
Далее нам нужно вычислить случайное значение от 0 до $count.
Но функции rand или даже mt_rand недостаточно защищены для использования из-за:
Осторожность Эта функция не генерирует криптографически безопасные значения и не должна использоваться в криптографических целях. Если вам нужно криптографически безопасное значение, рассмотрите возможность использования вместо него random_int(), random_bytes() или openssl_random_pseudo_bytes().
Вместо этого мы должны использовать, например, функцию random_int. Итак, чтобы выбрать защищенные случайные значения, мы реализуем код ниже:
$offset = random_int(0, max(0, $count - 1));
И, по крайней мере, мы могли бы получить случайную запись строки для таблицы:
return $this->createQueryBuilder('article')
->setFirstResult($offset)
->setMaxResult(1)
->getOneOrNullResult;
Отвечает ли это на ваш вопрос? Лучший способ выбрать случайные строки PostgreSQL