Można użyć znalezionego zapytania w celu wydajnego pobrania identyfikatorów N rekordów losowych za pośrednictwem natywnego zapytania SQL, a następnie wykonać zapytanie dotyczące doktryny w celu pobrania obiektów za pomocą metody WHERE IN(...)
przy użyciu polecenia dql.
Przykład:
// 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) . '
');
Tę samą strategię stosuje się, jeśli pobrać losowe identyfikatory z pamięci podręcznej (jak redis, może za pomocą SRANDMEMBER
) - najpierw pobrać identyfikatory, a następnie pobrać podmiotów poprzez WHERE IN
.
Musisz tylko upewnić się, że w pamięci podręcznej identyfikatory są zsynchronizowane z bazą danych (usunięte identyfikatory są usuwane z bazy danych oraz pamięci podręcznej, itp)
Możliwy duplikat [Jak wybrać losowo z doktryną] (http://stackoverflow.com/questions/10762538/how-to-select-randomly-with-doctrine) –