2016-06-11 6 views
1

テーブルの上位30レコードからランダムな行を取得しようとしています。 Iソートすべてscoreによってレコードが最初の、そして説得力のモデルの範囲で30件のレコードを取る:Laravel 5 - どのように雄弁に最初の30レコードからランダムな行を取得するには?

public function scopePopular($query, $d) 
{ 
    return $query->where('d', $d)->orderBy('score', 'desc')->take(30); 
} 

を次にclassに:

$cnt = Record::popular($d)->count(); 
if ($cnt == 0) 
    return; 

$randIndex = rand(0, $cnt-1); 
$record = Record::popular($d)->skip($randIndex)->take(1)->first(); 
return $record; 

しかし、私はPHPの職人ティンカーにチェック、I Record::popular($d)->count();は30の代わりにすべてのレコード番号を返します。この問題を解決するにはどうすればよいですか?ありがとう。数の前にクエリを実行する前にcount()

答えて

1

使用get()

$cnt = Record::popular($d)->get()->count(); 
+1

おかげで、それが動作するようになりました! –

1

あなたは、クエリを2回実行しています。それは必要ではありません。

$cnt = Record::popular($d)->count(); // First query 
if ($cnt == 0) 
    return; 

$randIndex = rand(0, $cnt-1); 
$record = Record::popular($d)->skip($randIndex)->take(1)->first(); // Second query 
return $record; 

代わりにあなたはこのようにそれを行うことができます。

return Record::popular($d)->get()->random(); // One query only 
+0

私は前にこれを試しました。 30レコードのランダムなレコードではなく、常に最上位のレコードを提供します。 –

+0

OK、はい私はそれを見ます。最初の順序はスコアであり、常に最初の順序です。しかし、2つのクエリを実行する必要はありません。あなたは実際に結果を1回取ってから、結果からランダムな行を選択してください。 – henrik

+0

あなたは正しいです、私はそれを改善します。ありがとう。 –

関連する問題