2016-11-24 36 views
4

Laravel Eloquentを使用して、トップ100からランダムな10行をどのように取ることができますか?トップ100からランダムに10行を取る

例えば、私はこのている:それは選択された100から10個のランダムな行をとるように

$comments = Comment::orderBy('created_at', 'DESC') 
    ->take(100) 
    ->inRandomOrder() 
    ->get(); 

どのように私はこれを変更することができますか?私は100行を取得する必要はありませんようにこれを行う方法はありますか?

+0

[How to Ask](http://stackoverflow.com/help/how-to-ask)を読んで、今後他の人(およびあなた)に役立つ質問を書くことをお考えください。はい/いいえ質問は通常役に立ちません。 – zhon

+2

@Zhon from op:*これを変更して100個のランダムな行を10個にする方法は?* 2番目の質問はメインではありませんでした。 – Derek

+0

あなたは誰を助けていません。特にあなたが私の質問を読んでも気にしないなら。 –

答えて

2

1からinRandomOrder()は本当に遅いですので、私はそれを使用することをお勧めいたしますないでしょう。

2 - take(100)->random()解決策は常にメモリに100行を取得し、次に10ランダムな行を取得します。あなたはcollecitonで唯一の5項目があるときは、エラーを取得している言及したので、代わりにこのコードを使用します。

$comments = Comment::latest()->take(100)->get(); 
$count = $comments->count() > 9 ? 10 : $comments->count(); 
$random = $comments->random($count); 

3 - このクエリはアプリあなたに本当に頻繁に実行されている場合は、私はあなたを推薦します追加の列sortを作成し、この列をスケジュールされたタスクに更新します。毎日または数時間のうち、sort列の値として1〜100の整数を設定します。それは、複雑なソリューションのように見える

$comments = Comment::orderBy('sort')->take(10)->get(); 

:テーブル内の100個の最新の行にこれらの数値を適用し、他の行は、その後、あなたは高速クエリで最新radnom 10行を取得することができるでしょう0

に設定します高負荷システムでは、これは最良のオプションの1つです。

+0

この行は '$ count = $ comments-> count()> 9で説明できますか? 10:$ comments-> count(); 'してください。 –

+0

@SanzeebAryalこのコードは、取得するいくつかのランダムな項目を設定します。テーブルに3つのアイテムしかない場合、このコードセットは3に制限されます。これはエラーを回避するのに役立ちます。 –

+0

と私はこのコードをどのように読むのですか? '$ comments-> count()'が9より大きい場合のようなものです.10を取る、そうでなければすべて取る?またはこの特定の種類のコードのリンクを教えてもらえますか?ありがとうございました。 –

0

あなたはrandom()を使用することができます。

$comments = Comment::orderBy('created_at', 'DESC') 
     ->take(100) 
     ->get() 
     ->random(10); 
+0

取得する結果が10個未満の場合(つまり、 'take(100)'のみが見つかった場合、例えば5個の結果)、 'You requested 10 items、コレクションには5つのアイテムしかありません。 –

+0

@ user7203124これはバグではなく、Lのdevteamメンバーが2yrs後に私に言ったように、それは機能です。 – Peter

関連する問題