377 Stimmen

Laravel - Eloquent oder Fluent zufällige Zeile

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

Ich weiß, dass man mit SQL eine Bestellung nach RAND() durchführen kann. Ich möchte jedoch die zufällige Zeile erhalten ohne eine Zählung der Anzahl der Datensätze vor der ersten Abfrage vorzunehmen.

Irgendwelche Ideen?

868voto

aebersold Punkte 10570

Laravel >= 5.2:

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

oder um die spezifische Anzahl der Datensätze zu erhalten

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

oder über die 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();

Siehe dieser Artikel auf MySQL-Zufallszeilen. Laravel 5.2 unterstützt dies, für ältere Versionen gibt es keine bessere Lösung als die Verwendung von RAW-Abfragen .

bearbeiten 1: Wie von Double Gras erwähnt, erlaubt orderBy() nichts anderes als ASC oder DESC, da este ändern. Ich habe meine Antwort entsprechend aktualisiert.

bearbeiten 2: Laravel 5.2 implementiert endlich eine Wrapper-Funktion für das hier. Es heißt inRandomOrder() .

60voto

Manish Punkte 1868

Das funktioniert sehr 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 Daten haben, da dies alle Zeilen zuerst abrufen und dann einen Zufallswert zurückgeben wird.

41voto

Gras Double Punkte 14944

tl;dr: Es ist heutzutage in Laravel implementiert, siehe "edit 3" unten.


Leider gibt es seit heute einige Vorbehalte gegen die ->orderBy(DB::raw('RAND()')) vorgeschlagene Lösung:

  • Es ist nicht DB-agnostisch. z.B. verwenden SQLite und PostgreSQL RANDOM()
  • Schlimmer noch, diese Lösung ist nicht mehr anwendbar, seit diese Änderung :

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

bearbeiten: Jetzt können Sie die 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 richtige Grammatik ersetzt wird. Außerdem scheint es ziemlich einfach zu implementieren zu sein. Sieht aus wie wir einen Kandidaten für die Verbesserung von Laravel haben :)

update: hier ist die Ausgabe darüber auf GitHub, und meine ausstehende Pull-Anfrage .

bearbeiten 2: Machen wir es kurz. Seit Laravel 5.1.18 können Sie Makros zum Query Builder 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]);
});

Verwendung:

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

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

bearbeiten 3: Endlich! Seit Laravel 5.2.33 ( Änderungsprotokoll , PR #13642 ) können Sie die native Methode inRandomOrder() :

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

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

30voto

simhumileco Punkte 26451

Sie können verwenden :

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

24voto

Talles Airan Punkte 321

Es ist sehr einfach nur überprüfen Sie 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();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X