L-4では簡単でした。
$random_quote = Quotation::all()->random(1);
しかし、現在、L-5では、この投稿で説明されている単一のメソッドは機能していません。 Laravel-EloquentまたはFluent random row
ビューファイルが空白になります。何か案は?
編集:
解決済み:$ random_quote = Quotation :: orderByRaw( "Rand()")-> first();
Laravel 5.4の更新
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でエラーになるため、代わりにinRandomOrder
を使用できます https://laravel.com/docs/5.2/queries#ordering-grouping-group-limit-and-offset 、
そして、それは次のような雄弁で動作します
Model::inRandomOrder()->first()
LARAVEL 5.3
これがネイティブクエリ関数になったことを嬉しく思います! :D
inRandomOrder
メソッドを使用して、クエリ結果をランダムに並べ替えることができます。たとえば、このメソッドを使用してランダムユーザーを取得できます。
$randomUser = DB::table('users')
->inRandomOrder()
->first();
残念ながら、これらの回答はいずれもLaravel 5のコレクションを完全に活用していません。私のようにGoogleからここに来た場合は、完全にネイティブなソリューションを探してください。
The Alphaからの回答にはデータベース依存性の欠陥があり、彼が指摘したように、Benjaminの間に行が削除されると問題が発生する可能性があります。可能性は非常に低いですが、まだ可能です。
Laravel 5+でランダムな行を選択するための1行のソリューション
// The setup
$numberOfRows = 4;
$models = Model::all(); // or use a ::where()->get();
// And the actual randomisation line
$randRows = $models->shuffle()->slice(0,numberOfRows);
出来上がり-ハッピーコーディング!あなたがそれを見たら投票してください、それでそれはページで上がります:)
OrderByRaw( 'Rand()')には2つの問題があります。
ここに私が使用した解決策がありますが、それは少し優れているようです:
$cnt = $records->count();
if ($cnt == 0)
return;
$randIndex = Rand(0, $cnt-1);
$obj = $records->skip($randIndex)->take(1)->first();
編集:データベースへの並列リクエストの場合、「count()」と「skip()」の間でいくつかのレコードが削除された場合、私のソリューションが問題になる可能性があることに注意してください。
Benjaminのアイデア を使用して、これを少し異なる方法で実装します。 Query Scope これは適切だと感じるので再利用可能であり、通常のEloquentの使用に分類されます。
注: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)では、Eloquentビルダーによって返されるrandom
クラスにCollection
メソッドがあります。 。
https://laravel.com/docs/5.1/collections#available-methods
あなたの電話
$random_quote = Quotation::all()->random(1);
または
$random_quote = Quotation::where('column', 'value')->get()->random(1);
正しく動作するはずです。
ララヴェル5.4
1)1つのランダムモデルが必要な場合:
$object = Model::all()->random();
2)多数のランダムモデルが必要な場合:
$object = Model::all()->random($n); //$n - number of elements
//$object - collection
コメント:$ collection-> random(1)を呼び出すと、1つのアイテムを持つ新しいコレクションインスタンスが返されます。このメソッドは、引数が指定されていない場合に1つのオブジェクトのみを返します。
ドキュメント参照: https://laravel.com/docs/5.4/collections#method-random
orderByRaw('Rand()')
注:残りのクエリからすべての行をRAMに取り込むため、同じクエリ内に他のフィルタがない大きなテーブルがある場合、パフォーマンスが低下します。そうでない場合はこれがオプションです