Laravel – Eloquent oder Fluent zufällige Reihe

Lesezeit: 6 Minuten

Laravel InnoDB
DigitalWM

Wie kann ich mit Eloquent oder Fluent im Laravel-Framework eine zufällige Zeile auswählen?

Ich weiß, dass Sie mit SQL nach RAND() bestellen können. Ich möchte jedoch die zufällige Zeile erhalten ohne Zählen der Anzahl der Datensätze vor der ersten Abfrage.

Irgendwelche Ideen?

  • Es gibt keinen besten Weg, dies zu tun, ohne mindestens zwei Abfragen auszuführen.

    – NARKOZ

    18. Dezember 2012 um 7:19 Uhr

Laravel Eloquent oder Fluent zufallige Reihe
aeberverkauft

Laravel >= 5.2:

User::inRandomOrder()->get();

oder um die bestimmte Anzahl von Datensätzen zu erhalten

// 5 indicates the number of records
User::inRandomOrder()->limit(5)->get();
// get one random record
User::inRandomOrder()->first();

oder mit der zufällig Methode für Sammlungen:

User::all()->random();
User::all()->random(10); // The amount of items you wish to receive

Laravel 4.2.7 – 5.1:

User::orderByRaw("RAND()")->get();

Laravel 4.0–4.2.6:

User::orderBy(DB::raw('RAND()'))->get();

Laravel 3:

User::order_by(DB::raw('RAND()'))->get();

Überprüfen Dieser Beitrag auf MySQL-Zufallszeilen. Laravel 5.2 unterstützt dies, für ältere Versionen gibt es keine bessere Lösung als die Verwendung RAW-Abfragen.

Bearbeiten 1: Wie von Double Gras erwähnt, erlaubt orderBy() seitdem nichts anderes als ASC oder DESC Das Veränderung. Ich habe meine Antwort entsprechend aktualisiert.

Bearbeiten 2: Laravel 5.2 endlich implementiert eine Wrapper-Funktion dafür. Es heißt inRandomOrder().

  • Ersetzen Sie ‘get’ durch ‘first’, wenn Sie eine einzelne Zeile möchten.

    – Collin Price

    20. Februar 2014 um 19:11 Uhr

  • für PostgreSQL-Nutzung 'RANDOM()'

    – dwenaus

    20. November 2014 um 16:01 Uhr

  • Warnung: Bei großen Datensätzen ist dies sehr langsam und fügt bei mir etwa 900 ms hinzu

    – S..

    4. Januar 2015 um 22:34 Uhr

  • Können wir das paginieren?

    – Irfandi D. Vendy

    22. September 2015 um 10:03 Uhr

  • Das ist möglich, die Sortierung erfolgt jedoch auf jeder neuen Seite zufällig. Was keinen Sinn macht, weil es im Wesentlichen dasselbe ist, als würden Sie F5 drücken.

    – aebersold

    22. September 2015 um 19:08 Uhr

1646181848 409 Laravel Eloquent oder Fluent zufallige Reihe
Manisch

Das funktioniert ganz gut,

$model=Model::all()->random(1)->first();

Sie können auch das Argument in der Zufallsfunktion ändern, um mehr als einen Datensatz zu erhalten.

Hinweis: Nicht empfohlen, wenn Sie große Datenmengen haben, da dies zuerst alle Zeilen abruft und dann einen Zufallswert zurückgibt.

  • Ein Leistungsnachteil besteht darin, dass alle Datensätze abgerufen werden.

    – Grasdoppelt

    21. Juli 2014 um 23:20 Uhr

  • Hier wird random für das Sammlungsobjekt aufgerufen, nicht für die SQL-Abfrage. Die Zufallsfunktion wird auf der PHP-Seite ausgeführt

    – astroanu

    15. Oktober 2015 um 6:13 Uhr

  • @astroanu Richtig, aber um diese Sammlung zu füllen, werden alle Zeilen abgefragt.

    – MetalFrog

    14. November 2015 um 1:08 Uhr

  • Ich könnte mich irren, aber das scheint nicht zu funktionieren, wenn der an die Zufallsfunktion übergebene Parameter der Größe der Sammlung entspricht.

    – Bryn Bateman

    25. Januar 2016 um 18:08 Uhr

  • Das ist nicht gut … Auf diese Weise rufen Sie alle Datensätze ab und erhalten einen zufälligen. Wenn Ihre Tabelle zu viele Datensätze hat, könnte dies schlecht für Ihre App sein.

    – Anderson Silva

    14. Juni 2016 um 14:23 Uhr

Laravel Eloquent oder Fluent zufallige Reihe
Gras doppelt

tl;dr: Es ist heutzutage in Laravel implementiert, siehe “Bearbeiten 3” unten.


Leider gibt es ab heute einige Vorbehalte mit dem ->orderBy(DB::raw('RAND()')) vorgeschlagene Lösung:

  • Es ist nicht DB-agnostisch. B. SQLite und PostgreSQL verwenden RANDOM()
  • Schlimmer noch, diese Lösung ist seitdem nicht mehr anwendbar dieser Wandel:

    $direction = strtolower($direction) == 'asc' ? 'asc' : 'desc';

bearbeiten: Jetzt können Sie die verwenden orderByRaw() Methode: ->orderByRaw('RAND()'). Dies ist jedoch immer noch nicht DB-agnostisch.

FWIW, CodeIgniter implementiert eine spezielle RANDOM Sortierrichtung, die beim Erstellen der Abfrage durch die korrekte Grammatik ersetzt wird. Es scheint auch ziemlich einfach zu implementieren zu sein. Sieht so aus, als hätten wir einen Kandidaten zur Verbesserung von Laravel 🙂

Update: Hier ist die Ausgabe dazu auf GitHub, und mein schwebendes Pull-Anfrage.

Bearbeiten 2: Lassen Sie uns die Verfolgung beenden. Seit Laravel 5.1.18 können Sie dem Query Builder Makros hinzufügen:

use Illuminate\Database\Query\Builder;

Builder::macro('orderByRandom', function () {

    $randomFunctions = [
        'mysql'  => 'RAND()',
        'pgsql'  => 'RANDOM()',
        'sqlite' => 'RANDOM()',
        'sqlsrv' => 'NEWID()',
    ];

    $driver = $this->getConnection()->getDriverName();

    return $this->orderByRaw($randomFunctions[$driver]);
});

Verwendungszweck:

User::where('active', 1)->orderByRandom()->limit(10)->get();

DB::table('users')->where('active', 1)->orderByRandom()->limit(10)->get();

edit 3: Endlich! Seit Laravel 5.2.33 (Änderungsprotokoll, PR-Nr. 13642) können Sie die native Methode verwenden inRandomOrder():

User::where('active', 1)->inRandomOrder()->limit(10)->get();

DB::table('users')->where('active', 1)->inRandomOrder()->limit(10)->get();

  • Sie sollten den 5.1-Makronamen in inRandomOrder ändern, damit es aufwärtskompatibel ist 😉 Details, Details 🙂

    – Sander Visser

    16. September 2016 um 12:34 Uhr

  • Genau das habe ich getan, als ich ein 5.1-Projekt vorbereitete, bevor ich es auf 5.2 migrierte.

    – Grasdoppelt

    16. September 2016 um 21:15 Uhr

  • Das ist so eine tolle Antwort. Wenn ich eine Antwort fav könnte, würde ich!

    – mwallisch

    15. Dezember 2019 um 11:31 Uhr

1646181850 884 Laravel Eloquent oder Fluent zufallige Reihe
simhumileco

Sie können verwenden:

ModelName::inRandomOrder()->first();

1646181850 208 Laravel Eloquent oder Fluent zufallige Reihe
Teodor Talow

Im Laravel 4 und 5 der order_by wird ersetzt durch orderBy

So sollte es sein:

User::orderBy(DB::raw('RAND()'))->get();

  • User::orderBy(DB::raw(‘RAND()’))->get();

    – Darius

    2. Dezember 2013 um 22:16 Uhr


  • Es funktioniert danke, aber könnten Sie einige Informationen geben, wie das funktioniert?

    – alayli

    16. Februar 2014 um 10:16 Uhr

  • Kannst du etwas genauer werden? Was für Informationen?

    – Teodor Talov

    17. Februar 2014 um 0:33 Uhr

Laravel Eloquent oder Fluent zufallige Reihe
Talles Airan

Es ist sehr einfach, überprüfen Sie einfach Ihre Laravel-Version

Laravel >= 5.2:

User::inRandomOrder()->get();
//or to get the specific number of records
// 5 indicates the number of records
User::inRandomOrder()->limit(5)->get();
// get one random record
User::inRandomOrder()->first();

oder mit der Zufallsmethode für Sammlungen:

User::all()->random();
User::all()->random(10); // The amount of items you wish to receive

Laravel 4.2.7 – 5.1:

 User::orderByRaw("RAND()")->get();

Laravel 4.0–4.2.6:

 User::orderBy(DB::raw('RAND()'))->get();

Laravel 3:

 User::order_by(DB::raw('RAND()'))->get();

  • User::orderBy(DB::raw(‘RAND()’))->get();

    – Darius

    2. Dezember 2013 um 22:16 Uhr


  • Es funktioniert danke, aber könnten Sie einige Informationen geben, wie das funktioniert?

    – alayli

    16. Februar 2014 um 10:16 Uhr

  • Kannst du etwas genauer werden? Was für Informationen?

    – Teodor Talov

    17. Februar 2014 um 0:33 Uhr

1646181851 553 Laravel Eloquent oder Fluent zufallige Reihe
Manuel Asar

Für Laravel 5.2 >=

Verwenden Sie die Eloquent-Methode:

inRandomOrder()

Die inRandomOrder-Methode kann verwendet werden, um die Abfrageergebnisse zufällig zu sortieren. Beispielsweise können Sie diese Methode verwenden, um einen zufälligen Benutzer abzurufen:

$randomUser = DB::table('users')
            ->inRandomOrder()
            ->first();

aus Dokumenten: https://laravel.com/docs/5.2/queries#ordering-grouping-limit-and-offset

  • Course::inRandomOrder()->take(20)->get(); Funktioniert bei mir nicht – schlechte Sortierspezifikation in Find.php Zeile 219

    – MJ

    29. Januar 2019 um 7:02 Uhr


  • Dies ist nützlich für Modellfabriken oder DB-Seeding

    – Saleh Mahmood

    10. Februar 2019 um 23:33 Uhr

906570cookie-checkLaravel – Eloquent oder Fluent zufällige Reihe

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy