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?

MatterGoal
la source

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

Yannick Y
la source
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();
ken4ward
la source
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();
Sébastien Horin
la source
10

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

$results = Project::latest('created_at')->get();
DsRaj
la source
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.

doncadavona
la source
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.

hkcoyant
la source
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.

Vhngroup Tecnologia
la source