Trier les résultats d’une requête : orderBy() et sortBy()

Dans une requête Eloquent, les deux principales méthodes permettant de trier des informations sont orderBy() et sortBy(). Le choix entre l'une et l'autre dépendra du type d'objet que nous détenons.

▼Publicité

Trier une instance du Query Builder : orderBy

Il est possible de spécifier comment trier les résultats d'une requête à l'aide de la fonction orderBy().

Ex :

Contrôleur Laravel (PHP)

$produits = Produit::orderBy('prix', 'desc')->get();

La méthode orderBy() pourra être chaînée à d'autres méthodes dans la requête :

Contrôleur Laravel (PHP)

$produits = Produit::where('categorie_id', 3)

    ->orderBy('description', 'asc')

    ->get();

Trier une collection : sortBy

Il n'est pas possible d'appliquer orderBy() sur une collection. En effet, la méthode orderBy() doit être utilisée sur une instance de Query Builder (donc avant que la requête ait été envoyée au serveur de base de données) puisque son rôle est d'ajouter une clause ORDER BY à la requête SQL.

L'instruction suivante produira l'erreur « BadMethodCallException in Macroable.php line 81: Method orderBy does not exist. ».

Contrôleur Laravel (PHP)

$produits = Produit::all()

    ->orderBy('prix', 'desc');

Lorsque nous avons en main une collection, est possible de la trier à l'aide de sortBy() :

Contrôleur Laravel (PHP)

$produits = Produit::all()

    ->sortBy('prix', 'desc');

Pour des raisons de performance, il est préférable d'utiliser le orderBy() lorsque c'est possible.

Dans un foreach, trier les éléments obtenus à l'aide d'une relation

Dans une boucle foreach, il est également possible de trier les éléments. Si le foreach est appliqué sur les résultats d'une relation, on aura en main une collection. Il est donc possible de trier les éléments à l'aide d'un sortBy().

Ex :

Vue Laravel (Blade)

@foreach($categorie->produits->sortBy('code') as $produit) {

    ...

@endforeach

Trier sur une colonne d'une table liée

Il est possible d'effectuer un tri sur une colonne d'une table liée. Cependant, il faudra d'abord effectuer une jointure.

Dans l'exemple suivant, on a une table produits liée à une table categories. On désire trier la liste des produits selon la description de la catégorie. On a spécifié une seconde clé de tri (un second orderBy()) puisque pour deux produits d'une même catégorie, on les veut en ordre de description de produit.

Contrôleur Laravel (PHP)

$produits = Produit::join('categories', 'categorie_id', '=', 'categories.id')

    ->select('produits.*')

    ->orderBy('categories.description')

    ->orderBy('produits.description')

    ->get();

Merci de partager ! Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedInPin on PinterestShare on StumbleUponEmail this to someone
Catégories