Laravel Eloquent: Classement des résultats de tous ()


215

Je suis coincé sur une tâche simple. J'ai juste besoin de commander les résultats de cet appel

$results = Project::all();

Projectest un modèle. J'ai essayé

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

Mais ça n'a pas marché. Quelle est la meilleure façon d'obtenir toutes les données d'une table et de les faire commander?

Réponses:



114

Vous pouvez toujours utiliser sortBy (au niveau de la collection) au lieu de orderBy (au niveau de la requête) si vous souhaitez toujours utiliser all () car il renvoie une collection d'objets.

Ordre croissant

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

Ordre décroissant

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

Consultez la documentation sur les collections pour plus de détails.

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


Exactement ce que je cherchais. Est-ce qu'une utilisation extensive de cela aurait des inconvénients par rapport à une utilisation orderByau niveau de la requête?
Giedrius

1
\ @foreach ($ posts-> sortByDesc ('created_at') en tant que $ post) \ @include ('posts.post') \ @endforeach
sdexp

2
Je souhaite savoir comment cela fonctionne en coulisses. Cela me semble comme si le tri de la collection sortBy()se orderBy()faisait à l' intérieur du moteur Laravel (en PHP), alors que cela se faisait dans la base de données. La base de données sera sûrement plus rapide dans presque toutes les situations imaginables, et à mesure que votre ensemble de données augmentera, la disparité des performances augmentera également. J'adorerais entendre les pensées des autres à ce sujet.
cartbeforehorse

3
@cartbeforehorse Vous devez savoir quelle méthode renvoie quoi. :: all () appelle probablement juste -> get () sous le capot, qui, à son tour, retourne une collection. sortBy () est une méthode d'une collection, donc oui cela se passe côté PHP (par opposition à orderBy () qui est appelé sur un objet de requête). C'est une mauvaise idée d'utiliser :: all (), et encore moins de le trier en PHP. Imaginez si :: all () retourne une collection avec un million d'objets. Il faudra trop de temps pour le récupérer et encore plus de temps pour le trier en PHP. Bien sûr, vous pouvez utiliser :: all () si vous savez avec certitude qu'il ne renverra qu'une poignée d'objets (dans une collection).
Avram

pourquoi celui-ci n'est pas la réponse acceptée? cela a fonctionné avec la fonction all ().
VishalParkash

36

De plus, juste pour étayer les réponses précédentes, il pourrait également être trié dans l'ordre décroissant descou croissant ascen ajoutant l'un ou l'autre comme deuxième paramètre.

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

14

Mise à jour 2017


Laravel 5.4 a ajouté des méthodes orderByDesc () au générateur de requêtes:

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

10

Bien que vous ayez besoin d'un résultat pour la date comme desc

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

9

FAITES CECI:

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

NE FAITES PAS CELA:

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

POURQUOI? En bref, la première approche est plus rapide que la deuxième approche.


3
Il serait intéressant d'ajouter une explication: la première approche rend l'ordre au niveau de la base de données (requête) qui est presque toujours beaucoup plus efficace - les meilleures performances. Je dirais toujours utiliser l'approche Model, quand vous aurez besoin de la deuxième approche, vous saurez :)
jave.web


4

Remarque, vous pouvez faire:

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

Cela génère une requête comme:

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

Dans certaines applications, lorsque la base de données n'est pas optimisée et que la requête est plus complexe, et que vous devez empêcher de générer un ORDER BY dans le SQL final, vous pouvez faire:

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

C'est maintenant php qui commande le résultat.


0

Votre instruction nécessite un appel pour l'obtenir, car est-ce qu'elle apporte les enregistrements et la commande?

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

Exemple:

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

Dans l'exemple, les données sont filtrées par "où" et apportent des enregistrements supérieurs à 20 et orderBy catalogue par ordre de haut en bas.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.