Ответ 1
Обновление для Laravel 5.4
Новый randomsorting в Laravel 5.4
->inRandomOrder()->first()
В L-4 это было просто:
$random_quote = Quotation::all()->random(1);
Но теперь в L-5 не работает ни один метод, описанный в этом сообщении: Laravel - Красноречивый или Свободный случайный ряд
Мой файл просмотра просто пуст. Любые идеи?
EDIT:
Решено: $ random_quote = Quotation:: orderByRaw ( "RAND()" ) → first();
Обновление для Laravel 5.4
Новый randomsorting в Laravel 5.4
->inRandomOrder()->first()
Это работает, но, вероятно, вы не использовали правильный namespace
, просто используйте оператор use
в верхней части своего class
имени:
<?php namespace SomeNamespace;
use App\Quotation; // Says "Quotation.php" is in "App" folder (By default in L-5.0)
class someClass {
//...
}
Затем вы можете использовать в своем method
что-то вроде этого:
// You may add: use DB; at the top to use DB instead of \DB
$random_quote = Quotation::orderBy(\DB::raw('RAND()'))->first();
Или это:
$random_quote = Quotation::orderByRaw("RAND()")->first();
Обновление (так как Laravel - 5.2):
$random_quote = Quotation::inRandomOrder()->first();
random()
дает ошибку в 5.2, поэтому вместо u вы можете использовать inRandomOrder
https://laravel.com/docs/5.2/queries#ordering-grouping-limit-and-offset,
и он работает на Eloquent, как
Model::inRandomOrder()->first()
В OrderByRaw ('RAND()') есть 2 проблемы:
Вот решение, которое я использовал, что кажется немного лучше:
$cnt = $records->count();
if ($cnt == 0)
return;
$randIndex = rand(0, $cnt-1);
$obj = $records->skip($randIndex)->take(1)->first();
РЕДАКТИРОВАТЬ: Обратите внимание, что мое решение может быть проблемой (сбой, если не удача) в случае запросов parrallel к базе данных, если некоторые записи удаляются между "count()" и "skip()".
ОБНОВЛЕНИЕ ДЛЯ LARAVEL 5.3
Я был рад узнать, что теперь это встроенная функция запросов!: D
Метод inRandomOrder
может использоваться для сортировки результатов запроса случайным образом. Например, вы можете использовать этот метод для извлечения случайного пользователя:
$randomUser = DB::table('users')
->inRandomOrder()
->first();
К сожалению, ни один из этих ответов не в полной мере использует коллекции Laravel 5. Если вы пришли сюда из Google, как и я, ища полностью родное решение, посмотрите ниже!
Ответ от Alpha имеет недостаток зависимости базы данных, и Бенджамин, как он отметил, может представлять проблему, когда строки удаляются между ними. Очень маловероятно, но все же возможно.
Здесь существует однострочное решение для выбора случайных строк в Laravel 5 +
// The setup
$numberOfRows = 4;
$models = Model::all(); // or use a ::where()->get();
// And the actual randomisation line
$randRows = $models->shuffle()->slice(0,numberOfRows);
Эт вуаля - счастливая кодировка! Проголосуйте, когда увидите это, чтобы он поднялся на странице:)
Я бы реализовал это несколько иначе, используя идею Бенджамина. A Область запроса, потому что это кажется уместным, поэтому оно многократно используется, и оно попадает в ваше обычное "Красноречивое" использование.
Примечание: В Eloquent 5.2 встроена поддержка глобальных областей.
Я собираюсь создать черту, которую могут использовать модели, но вы можете просто добавить метод scopeRandom
непосредственно к вашей конкретной модели.
/app/GlobalScopes.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
trait GlobalScopes
{
public function scopeRandom($query){
$totalRows = static::count() - 1;
$skip = $totalRows > 0 ? mt_rand(0, $totalRows) : 0;
return $query->skip($skip)->take(1);
}
}
Затем, каждая модель, которую вы хотите использовать глобальные области, назовите признак внутри класса.
/app/Quotation.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Quotation extends Model
{
use GlobalScopes;
//...
}
При использовании:
$randomQuote = \Quotation::random()->first();
В Laravel 5.1 (и Laravel 5.2) существует метод random
в классе Collection
, возвращаемом конструктором Eloquent.
https://laravel.com/docs/5.1/collections#available-methods
Итак, ваш звонок
$random_quote = Quotation::all()->random(1);
или
$random_quote = Quotation::where('column', 'value')->get()->random(1);
должен работать правильно.
orderByRaw('RAND()')
Примечание. Это займет все строки из остальной части запроса, поэтому, если у вас есть большая таблица без других фильтров в одном запросе, это даст плохие результаты, иначе это ваш вариант
Laravel 5.4
1), если нужна одна случайная модель:
$object = Model::all()->random();
2) при необходимости много случайных моделей:
$object = Model::all()->random($n); //$n - number of elements
//$object - collection
Комментарий: вызов $collection- > random (1) теперь возвращает новый экземпляр коллекции с одним элементом. Этот метод будет возвращать только один объект, если аргументы не указаны.
Doc ref: https://laravel.com/docs/5.4/collections#method-random