Старый вопрос, но это то, с чем я столкнулся сегодня, желая выбрать случайную страницу. Я решил не использовать ни одного из ответов здесь из-за проблем с производительностью и того факта, что многие из них имеют сильные предубеждения в «случайном». Вот мое решение (используя PHP):
Pages model:
public static function getIDs() {
$sql = "SELECT `id` FROM `pages`;";
$db = static::getDB();
$stmt = $db->query($sql);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
Pages controller:
public function randomAction() {
$pages = Pages::getIDs();
$random = $pages[rand(0, count($pages))];
$this->redirect('/' . $random['id'], 307);
}
В принципе, все, что он делает, это получить массив пулов страниц из БД и использование PHP для выбора случайного из возвращаемого массива.
Если вы хотите 10 записей, просто перебирайте массив и удалите выбранные, чтобы избежать дублирования, а затем добавьте их к отдельному массиву результатов. Что-то вроде этого:
public static function randomAction() {
$pages = Pages::getIDs();
$count = count($pages);
$results = [];
for($i = 0; $i < 10; $i++) {
$random = rand(0, $count);
$count -= 1;
$results[] = $pages[$random];
unset($pages[$random]);
}
return $results;
}