回答:
Laravel> = 5.2:
User::all()->random();
User::all()->random(10); // The amount of items you wish to receive
または
User::inRandomOrder()->get();
または特定の数のレコードを取得する
//5 indicates the number of records
User::inRandomOrder()->limit(5)->get();
Laravel 4.2.7-5.1:
User::orderByRaw("RAND()")->get();
Laravel 4.0〜4.2.6:
User::orderBy(DB::raw('RAND()'))->get();
Laravel 3:
User::order_by(DB::raw('RAND()'))->get();
MySQLのランダムな行に関するこの記事を確認してください。Laravel 5.2はこれをサポートしています。古いバージョンの場合、RAWクエリを使用するよりも優れたソリューションはありません。
編集1: Double Grasで述べたように、orderBy()では、この変更以降、ASCまたはDESC以外は許可されません。私はそれに応じて私の答えを更新しました。
編集2: Laravel 5.2は最終的にこのためのラッパー関数を実装します。これはinRandomOrder()と呼ばれます。
'RANDOM()'
これはうまく機能し、
$model=Model::all()->random(1)->first();
ランダム関数の引数を変更して、複数のレコードを取得することもできます。
注:巨大なデータがある場合は、最初にすべての行をフェッチしてからランダムな値を返すため、お勧めしません。
tl; dr:現在はLaravelに実装されています。以下の「編集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以降、クエリビルダーにマクロを追加できます。
use Illuminate\Database\Query\Builder;
Builder::macro('orderByRandom', function () {
$randomFunctions = [
'mysql' => 'RAND()',
'pgsql' => 'RANDOM()',
'sqlite' => 'RANDOM()',
'sqlsrv' => 'NEWID()',
];
$driver = $this->getConnection()->getDriverName();
return $this->orderByRaw($randomFunctions[$driver]);
});
使用法:
User::where('active', 1)->orderByRandom()->limit(10)->get();
DB::table('users')->where('active', 1)->orderByRandom()->limit(10)->get();
編集3:最後に!Laravel 5.2.33(changelog、PR# 13642)以降、ネイティブメソッドを使用できますinRandomOrder()
。
User::where('active', 1)->inRandomOrder()->limit(10)->get();
DB::table('users')->where('active', 1)->inRandomOrder()->limit(10)->get();
でLaravel 4及び5order_by
により置換されていますorderBy
したがって、次のようになります。
User::orderBy(DB::raw('RAND()'))->get();
使用できます:
ModelName::inRandomOrder()->first();
Laravel 5.2の場合> =
Eloquentメソッドを使用します。
inRandomOrder()
inRandomOrderメソッドを使用すると、クエリ結果をランダムにソートできます。たとえば、このメソッドを使用してランダムなユーザーをフェッチできます。
$randomUser = DB::table('users')
->inRandomOrder()
->first();
ドキュメントから:https : //laravel.com/docs/5.2/queries#ordering-grouping-limit-and-offset
Laravelには、結果の順序を並べ替える組み込みメソッドがあります。
これはドキュメントからの引用です:
shuffle()
シャッフルメソッドは、コレクション内のアイテムをランダムにシャッフルします。
$collection = collect([1, 2, 3, 4, 5]);
$shuffled = $collection->shuffle();
$shuffled->all();
// [3, 2, 5, 1, 4] - (generated randomly)
あなたのモデルでこれを追加してください:
public function scopeRandomize($query, $limit = 3, $exclude = [])
{
$query = $query->whereRaw('RAND()<(SELECT ((?/COUNT(*))*10) FROM `products`)', [$limit])->orderByRaw('RAND()')->limit($limit);
if (!empty($exclude)) {
$query = $query->whereNotIn('id', $exclude);
}
return $query;
}
その後、ルート/コントローラで
$data = YourModel::randomize(8)->get();
数千のレコードを含むテーブルがあるので、何か高速なものが必要です。これは、疑似ランダム行の私のコードです:
// count all rows with flag active = 1
$count = MyModel::where('active', '=', '1')->count();
// get random id
$random_id = rand(1, $count - 1);
// get first record after random id
$data = MyModel::where('active', '=', '1')->where('id', '>', $random_id)->take(1)->first();
$count
、最初の行だけが取得されるため、他の行よりも取得される可能性が高いことです。