2016-06-11 3 views
1

Ich versuche, eine zufällige Zeile aus den oberen 30 Datensätze in einer Tabelle zu bekommen. Ich sortiere alle Datensätze von score ersten und nehmen 30 Datensätze in einem Rahmen des beredten Modell:Laravel 5 - wie man eine zufällige Reihe von den ersten 30 Akten in beredten bekommt?

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

Dann wird in einem 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; 

Aber wenn ich in php Handwerker basteln überprüfen, I festgestellt, dass Record::popular($d)->count(); wird alle Datensätze Nummer anstelle von 30 zurückgegeben. Wie kann ich dieses Problem beheben? Vielen Dank.

Antwort

1

Verwenden get() vor count() die Abfrage vor Zählung auszuführen:

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

Danke, es funktioniert jetzt! –

1

Sie die Abfrage 2-mal ausgeführt wird. Das ist nicht nötig.

$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; 

Stattdessen können Sie es wie folgt tun:

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

Ich habe das schon mal versucht. Und es gibt mir immer die oberste Aufzeichnung, statt einer zufälligen in 30 Aufzeichnungen. –

+0

OK, ja, ich sehe es jetzt, da die erste Bestellung von auf der Partitur ist, wird es immer die erste Bestellung sein .. Sie müssen jedoch nicht 2 Anfragen machen. Sie sollten wirklich versuchen, das Ergebnis einmal zu holen und wählen Sie dann die zufällige Zeile aus dem Ergebnis von PHP – henrik

+0

Sie haben Recht, ich werde das verbessern. Vielen Dank. –

Verwandte Themen