Wie kann ich eine zufällige Zeile mit Eloquent oder Fluent in Laravel auswählen?
Ich weiß, dass Sie mit SQL nach RAND () bestellen können. Ich möchte jedoch die zufällige Zeile erhalten, ohne die Anzahl der Datensätze vor der ersten Abfrage zu zählen.
Irgendwelche Ideen?
Antworten:
Laravel> = 5,2:
oder
oder um die spezifische Anzahl von Datensätzen zu erhalten
Laravel 4.2.7 - 5.1:
Laravel 4.0 - 4.2.6:
Laravel 3:
Überprüfen Sie diesen Artikel über zufällige MySQL-Zeilen. Laravel 5.2 unterstützt dies. Für ältere Versionen gibt es keine bessere Lösung als die Verwendung von RAW-Abfragen .
edit 1: Wie von Double Gras erwähnt, erlaubt orderBy () seit dieser Änderung nichts anderes als ASC oder DESC . Ich habe meine Antwort entsprechend aktualisiert.
edit 2: Laravel 5.2 implementiert hierfür endlich eine Wrapper-Funktion . Es heißt inRandomOrder () .
quelle
'RANDOM()'
Das funktioniert gut,
Sie können das Argument auch in einer Zufallsfunktion ändern, um mehr als einen Datensatz zu erhalten.
Hinweis: Nicht empfohlen, wenn Sie über große Datenmengen verfügen, da hierdurch zuerst alle Zeilen abgerufen werden und dann ein zufälliger Wert zurückgegeben wird.
quelle
tl; dr: Es ist heutzutage in Laravel implementiert, siehe "edit 3" unten.
Leider gibt es ab heute einige Einschränkungen bei der
->orderBy(DB::raw('RAND()'))
vorgeschlagenen Lösung:RANDOM()
Schlimmer noch, diese Lösung ist seit dieser Änderung nicht mehr anwendbar :
$direction = strtolower($direction) == 'asc' ? 'asc' : 'desc';
edit: Jetzt können Sie die orderByRaw () -Methode verwenden :
->orderByRaw('RAND()')
. Dies ist jedoch immer noch nicht DB-agnostisch.FWIW, CodeIgniter implementiert eine spezielle
RANDOM
Sortierrichtung, die beim Erstellen von Abfragen durch die richtige Grammatik ersetzt wird. Es scheint auch ziemlich einfach zu implementieren zu sein. Sieht so aus, als hätten wir einen Kandidaten für die Verbesserung von Laravel :)Update: Hier ist das Problem auf GitHub und meine ausstehende Pull-Anfrage .
edit 2: Lass uns die Jagd abschneiden. Seit Laravel 5.1.18 können Sie dem Abfrage-Generator Makros hinzufügen:
Verwendung:
edit 3: Endlich! Seit Laravel 5.2.33 ( Changelog , PR # 13642 ) können Sie die native Methode verwenden
inRandomOrder()
:quelle
In Laravel 4 und 5 , die
order_by
ersetzt wird durchorderBy
So sollte es sein:
quelle
Sie können verwenden :
quelle
Für Laravel 5.2> =
Verwenden Sie die eloquente Methode:
Die inRandomOrder-Methode kann verwendet werden, um die Abfrageergebnisse zufällig zu sortieren. Mit dieser Methode können Sie beispielsweise einen zufälligen Benutzer abrufen:
aus Dokumenten: https://laravel.com/docs/5.2/queries#ordering-grouping-limit-and-offset
quelle
Sie können die order_by-Methode auch fließend und eloquent verwenden, z.
Dies ist eine etwas seltsame Verwendung, funktioniert aber.
Bearbeiten: Wie @Alex sagte, ist diese Verwendung sauberer und funktioniert auch:
quelle
Verwenden Sie die Laravel-Funktion
quelle
Sie können diesen Befehl ganz einfach verwenden:
// Frage: Name des Modells
// 10 Zeilen aus DB nehmen In Shuffle-Datensätzen ...
quelle
Ich ziehe es vor, zuerst anzugeben oder fehlzuschlagen:
quelle
Laravel verfügt über eine integrierte Methode, um die Reihenfolge der Ergebnisse zu mischen.
Hier ist ein Zitat aus der Dokumentation:
Die Shuffle-Methode mischt die Elemente in der Sammlung nach dem Zufallsprinzip:
Die Dokumentation finden Sie hier .
quelle
Fügen Sie bei Ihrem Modell Folgendes hinzu:
dann an der Route / Steuerung
quelle
Es gibt auch
whereRaw('RAND()')
welche das gleiche tut, können Sie dann Kette->get()
oder->first()
oder sogar verrückt werden und fügen->paginate(int)
.quelle
Ich habe einen Tisch mit Tausenden von Datensätzen, also brauche ich etwas schnelles. Dies ist mein Code für Pseudozufallszeilen:
quelle
$count
nur die erste, jemals abgerufen wird, und es daher auch wahrscheinlicher ist, dass sie abgerufen werden als jede andere Zeile.