Как получить случайную запись из БД?

Мне нужно получить случайную запись из базы данных. Как я это делаю:

$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();

Я не понимаю, почему функция возвращает ноль. Как мне более корректно получить случайную запись из базы данных?

Отвечает ли это на ваш вопрос? Лучший способ выбрать случайные строки PostgreSQL

ArSeN 24.12.2020 21:49

Количество записей не обязательно совпадает с идентификаторами ваших строк данных. то есть ваши идентификаторы строк могут начинаться с 10000, но у вас есть только 50 записей. Тогда ты никогда не получишь результат.

ArSeN 24.12.2020 21:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
84
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
$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;

Другие вопросы по теме