Как я могу выбрать случайную строку, используя Eloquent или Fluent в Laravel Framework?
Я знаю, что с помощью SQL вы можете сделать заказ с помощью RAND (). Тем не менее, я хотел бы получить случайную строку без подсчета количества записей до первоначального запроса.
Любые идеи?
Ответы:
Laravel> = 5.2:
или
или получить конкретное количество записей
Laravel 4.2.7 - 5.1:
Laravel 4.0 - 4.2.6:
Ларавелла 3:
Проверьте эту статью на случайных строках MySQL. Laravel 5.2 поддерживает это, для более старой версии нет лучшего решения, чем использование RAW Queries .
edit 1: Как упоминалось в Double Gras, orderBy () не допускает ничего, кроме ASC или DESC, с момента этого изменения. Я обновил свой ответ соответственно.
edit 2: Laravel 5.2 наконец-то реализует функцию-обертку для этого. Это называется inRandomOrder () .
источник
'RANDOM()'
Это работает просто отлично,
Вы также можете изменить аргумент в случайной функции, чтобы получить более одной записи.
Примечание: не рекомендуется, если у вас огромные данные, так как сначала будут извлечены все строки, а затем возвращено случайное значение.
источник
tl; dr: В настоящее время он реализован в Laravel, см. «edit 3» ниже.
К сожалению, на сегодняшний день есть несколько предостережений с
->orderBy(DB::raw('RAND()'))
предлагаемым решением:RANDOM()
Хуже того, это решение больше не применимо после этого изменения :
$direction = strtolower($direction) == 'asc' ? 'asc' : 'desc';
Редактирование: Теперь вы можете использовать orderByRaw () метод:
->orderByRaw('RAND()')
. Однако это все еще не DB-агностик.FWIW, CodeIgniter реализует специальное
RANDOM
направление сортировки, которое заменяется правильной грамматикой при построении запроса. Также это кажется довольно простым для реализации. Похоже, у нас есть кандидат на улучшение Laravel :)обновление: вот проблема об этом на GitHub, и мой ожидающий запрос на извлечение .
редактировать 2: Давайте сокращать погоню. Начиная с Laravel 5.1.18 вы можете добавлять макросы в конструктор запросов:
Использование:
редактировать 3: наконец-то! Начиная с Laravel 5.2.33 ( changelog , PR # 13642 ) вы можете использовать собственный метод
inRandomOrder()
:источник
В Laravel 4 и 5
order_by
заменяетсяorderBy
Итак, должно быть:
источник
Вы можете использовать :
источник
Для Laravel 5.2> =
используйте метод Eloquent:
Метод inRandomOrder может использоваться для случайной сортировки результатов запроса. Например, вы можете использовать этот метод для выборки случайного пользователя:
из документов: https://laravel.com/docs/5.2/queries#ordering-grouping-limit-and-offset
источник
Вы также можете использовать метод order_by с свободно и красноречиво, например:
Это немного странное использование, но работает.
Редактировать: Как сказал @Alex, это использование является более чистым и также работает:
источник
Используйте функцию Laravel
источник
Вы можете легко использовать эту команду:
// Вопрос: имя модели
// взять 10 строк из БД в случайных записях ...
источник
Я предпочитаю указывать в первую очередь или нет:
источник
В Laravel есть встроенный метод для изменения порядка результатов.
Вот цитата из документации:
Метод shuffle случайным образом перемешивает элементы в коллекции:
Вы можете увидеть документацию здесь .
источник
В вашей модели добавьте это:
тогда на маршруте / контроллере
источник
Существует также ,
whereRaw('RAND()')
который делает то же самое, вы можете цепи->get()
или->first()
даже сходят с ума и добавить->paginate(int)
.источник
У меня есть таблица с тысячами записей, поэтому мне нужно что-то быстрое. Это мой код для псевдослучайной строки:
источник
$count
только первую из них, они будут извлечены, и поэтому он также будет получен с большей вероятностью, чем любая другая строка.