Get your next remote job on LaraJobs.
Laravel

Sort your Laravel Eloquent queries results using orderBy()

Benjamin Crozat
Modified on Dec 20, 2023 0 comments Edit on GitHub
Sort your Laravel Eloquent queries results using orderBy()

The basics of orderBy()

Before we dive deep, let’s understand the foundation of the orderBy() method:

$users = User::query()
    ->orderBy('name', 'desc')
    ->get();

In this snippet, we’re using Laravel Eloquent to fetch users from their table and ordering them in descending order by their names thanks to the orderBy() method.

Its parameters are:

  • The column’s name.
  • The order direction: Either asc (the default value) for ascending or desc for descending.

The orderByDesc() method

If you want to sort your results in descending order, you can also use the orderByDesc() method, which is a shortcut for orderBy('column', 'desc'):

$users = User::query()
    ->orderBy('name', 'desc') // [tl! --]
    ->orderByDesc('name') // [tl! ++]
    ->get();

It’s all in the details! 👌

Multi-column sorting using orderBy()

What if you want to sort by multiple columns? Simple. Just chain multiple orderBy() methods:

$users = User::query()
    ->orderBy('name', 'desc')
    ->orderBy('email', 'asc')
    ->get();

This way, Eloquent sorts users by their names first. If two or more users have the same name, it then sorts those users by their email in ascending order.

I actually learned that only after years of SQL and Laravel experience. 😅

Getting fancy with orderByRaw()

When you need a more complex sorting mechanism, Laravel’s got you covered with orderByRaw():

$orders = User::query()
    ->orderByRaw('updated_at - created_at DESC')
    ->get();

This advanced method lets you sort the results based on the difference between the updated_at and created_at timestamps. Handy, right?

Use reorder() to unorder what’s already been ordered

If you need to undo the ordering of a query you are building based on some condition, you can use the reorder() method:

$ordered = User::orderBy('name');

$unordered = $ordered->reorder()->get();

And if you wish to reset and apply a completely new ordering without calling orderBy() again:

$ordered = User::query()->orderBy('name');

$reorderedByEmail = $query->reorder('email', 'desc')->get();

I’ll never get bored of Laravel’s convenience!

Wait, there's more!

Be the first to comment!

Get help or share something of value with other readers!

Great deals for enterprise developers
  • ZoneWatcher
    Get instant alerts on DNS changes across all major providers, before your customers notice.
    25% off for 12 months using the promo code CROZAT.
    Try ZoneWatcher for free
  • Quickly build highly customizable admin panels for Laravel projects.
    20% off on the pro version using the promo code CROZAT.
    Try Backpack for free
  • Summarize and talk to YouTube videos. Bypass ads, sponsors, chit-chat, and get to the point.
    Try Nobinge →
  • Monitor the health of your apps: downtimes, certificates, broken links, and more.
    20% off the first 3 months using the promo code CROZAT.
    Try Oh Dear for free
  • Keep the customers coming; monitor your Google rankings.
    30% off your first month using the promo code WELCOME30
    Try Wincher for free →
The latest community links
- / -