Laravel Eloquent: Bestellergebnisse aller ()

214

Ich bin auf eine einfache Aufgabe fixiert. Ich muss nur die Ergebnisse dieses Anrufs bestellen

$results = Project::all();

Wo Projectist ein Modell? Ich habe es versucht

$results = Project::all()->orderBy("name");

Aber es hat nicht funktioniert. Was ist der bessere Weg, um alle Daten aus einer Tabelle abzurufen und zu bestellen?

MatterGoal
quelle

Antworten:

114

Sie können weiterhin sortBy (auf Sammlungsebene) anstelle von orderBy (auf Abfrageebene) verwenden, wenn Sie weiterhin all () verwenden möchten, da eine Sammlung von Objekten zurückgegeben wird.

Aufsteigende Reihenfolge

$results = Project::all()->sortBy("name");

Absteigende Reihenfolge

$results = Project::all()->sortByDesc("name");

Weitere Informationen finden Sie in der Dokumentation zu Sammlungen.

https://laravel.com/docs/5.1/collections

Yannick Y.
quelle
Genau das, wonach ich gesucht habe. Hätte eine umfassende Nutzung dies Nachteile im Vergleich zur Verwendung orderByauf Abfrageebene?
Giedrius
1
\ @foreach ($ posts-> sortByDesc ('created_at') als $ post) \ @include ('posts.post') \ @endforeach
sdexp
2
Ich bin daran interessiert zu wissen, wie das hinter den Kulissen funktioniert. Es fällt mir auf, als ob das Sortieren der Sammlung mit sortBy()innerhalb der Laravel Engine (in PHP) erfolgt, während das orderBy()in der Datenbank erfolgt. Sicherlich wird die Datenbank in fast allen denkbaren Situationen schneller sein, und mit zunehmendem Dataset steigt auch die Leistungsunterschiede. Ich würde gerne die Gedanken anderer Leute darüber hören.
Cartbeforehorse
3
@cartbeforehorse Sie müssen wissen, welche Methode was zurückgibt. :: all () ruft wahrscheinlich nur -> get () unter der Haube auf, was wiederum eine Sammlung zurückgibt. sortBy () ist eine Methode einer Sammlung, also ja, es passiert auf der PHP-Seite (im Gegensatz zu orderBy (), das für ein Abfrageobjekt aufgerufen wird). Es ist eine schlechte Idee, :: all () überhaupt zu verwenden, geschweige denn in PHP zu sortieren. Stellen Sie sich vor, :: all () gibt eine Sammlung mit einer Million Objekten zurück. Das Abrufen dauert zu lange und das Sortieren in PHP noch länger. Natürlich können Sie :: all () verwenden, wenn Sie sicher sind, dass nur eine Handvoll Objekte (in einer Sammlung) zurückgegeben werden.
Avram
Warum ist dies nicht die akzeptierte Antwort? es funktionierte mit der all () Funktion.
VishalParkash
36

Um die früheren Antworten zu untermauern, kann es außerdem entweder in absteigender descoder aufsteigender ascReihenfolge sortiert werden, indem entweder als zweiter Parameter hinzugefügt wird.

$results = Project::orderBy('created_at', 'desc')->get();
ken4ward
quelle
14

Update 2017


Laravel 5.4 hat orderByDesc () -Methoden zum Abfrage-Builder hinzugefügt:

$results = Project::orderByDesc('name')->get();
Sebastien Horin
quelle
10

Während Sie Ergebnis für Datum als absteigend benötigen

$results = Project::latest('created_at')->get();
DsRaj
quelle
9

MACH DAS:

$results = Project::orderBy('name')->get();

TUN SIE DAS NICHT:

$results = Project::all()->sortBy('name');

WARUM? Kurz gesagt, der erste Ansatz ist schneller als der zweite Ansatz.

Doncadavona
quelle
3
Es wäre schön, eine Erklärung hinzuzufügen, warum: Der erste Ansatz macht die Bestellung auf Datenbankebene (Abfrageebene) fast immer viel effizienter - die beste Leistung. Ich würde sagen, verwenden Sie immer Modellansatz, wenn Sie den zweiten Ansatz benötigen, werden Sie wissen :)
jave.web
4

Beachten Sie, dass Sie Folgendes tun können:

$results = Project::select('name')->orderBy('name')->get();

Dies erzeugt eine Abfrage wie:

"SELECT name FROM proyect ORDER BY 'name' ASC"

In einigen Apps können Sie Folgendes tun, wenn die Datenbank nicht optimiert ist und die Abfrage komplexer ist und Sie verhindern müssen, dass im fertigen SQL ein ORDER BY generiert wird:

$result = Project::select('name')->get();
$result = $result->sortBy('name');
$result = $result->values()->all();

Jetzt ist PHP, der das Ergebnis bestellt.

hkcoyant
quelle
0

Ihre Anweisung erfordert einen Anruf, um zu erhalten, weil es die Aufzeichnungen bringt und durch den Katalog bestellt

$results = Project::orderBy('name')
           ->get();

Beispiel:

$results = Result::where ('id', '>=', '20')
->orderBy('id', 'desc')
->get();

Im Beispiel werden die Daten nach "wo" gefiltert und bringen Datensätze größer als 20 und orderBy-Katalog nach Reihenfolge von hoch nach niedrig.

Vhngroup Tecnologia
quelle