Вы можете использовать запрос, который вы нашли, чтобы эффективно извлекать идентификаторы N случайных записей через собственный запрос sql, а затем выполнить запрос доктрины, чтобы получить объекты через WHERE IN(...)
, используя dql.
Пример:
// fetch $randomIds via native sql query using $em->getConnection()->... methods
// or from a memory based cache
$qb = $em->createQueryBuilder('u');
$em->createQuery('
SELECT u
FROM Entity\User
WHERE ' . $qb->expr()->in('u.id', $randomIds) . '
');
Та же стратегия применяется, если вы выбираете случайные идентификаторы из кэша (например, redis , возможно, с использованием SRANDMEMBER
) - сначала выберите идентификаторы, а затем выберите сущности через WHERE IN
.
Вам просто нужно убедиться, что ваши кэшированные идентификаторы синхронизированы с базой данных (удаленные идентификаторы удаляются из базы данных, из кэша и т. Д.)