Laravel Eloquent: Ordering results of all()
LaravelLaravel 4EloquentSql Order-ByLaravel Problem Overview
I'm stuck on a simple task. I just need to order results coming from this call
$results = Project::all();
Where Project
is a model. I've tried this
$results = Project::all()->orderBy("name");
But it didn't work. Which is the better way to obtain all data from a table and get them ordered?
Laravel Solutions
Solution 1 - Laravel
You can actually do this within the query.
$results = Project::orderBy('name')->get();
This will return all results with the proper order.
Solution 2 - Laravel
You could still use sortBy (at the collection level) instead of orderBy (at the query level) if you still want to use all() since it returns a collection of objects.
Ascending Order
$results = Project::all()->sortBy("name");
Descending Order
$results = Project::all()->sortByDesc("name");
Check out the documentation about Collections for more details.
Solution 3 - Laravel
In addition, just to buttress the former answers, it could be sorted as well either in descending desc
or ascending asc
orders by adding either as the second parameter.
$results = Project::orderBy('created_at', 'desc')->get();
Solution 4 - Laravel
DO THIS:
$results = Project::orderBy('name')->get();
Why? Because it's fast! The ordering is done in the database.
DON'T DO THIS:
$results = Project::all()->sortBy('name');
Why? Because it's slow. First, the the rows are loaded from the database, then loaded into Laravel's Collection class, and finally, ordered in memory.
Solution 5 - Laravel
2017 update
Laravel 5.4 added orderByDesc() methods to query builder:
$results = Project::orderByDesc('name')->get();
Solution 6 - Laravel
While you need result for date as desc
$results = Project::latest('created_at')->get();
Solution 7 - Laravel
In Laravel Eloquent you have to create like the query below it will get all the data from the DB, your query is not correct:
$results = Project::all()->orderBy("name");
You have to use it in this way:
$results = Project::orderBy('name')->get();
By default, your data is in ascending order, but you can use it in the following way:
$results = Project::orderBy('name', 'asc')->get();
Or in descending order:
$results = Project::orderBy('name', 'desc')->get();
Solution 8 - Laravel
Check out the sortBy
method for Eloquent: http://laravel.com/docs/eloquent
Solution 9 - Laravel
Note, you can do:
$results = Project::select('name')->orderBy('name')->get();
This generate a query like:
"SELECT name FROM proyect ORDER BY 'name' ASC"
In some apps when the DB is not optimized and the query is more complex, and you need prevent generate a ORDER BY in the finish SQL, you can do:
$result = Project::select('name')->get();
$result = $result->sortBy('name');
$result = $result->values()->all();
Now is php who order the result.
Solution 10 - Laravel
You instruction require call to get, because is it bring the records and orderBy the catalog
$results = Project::orderBy('name')
->get();
Example:
$results = Result::where ('id', '>=', '20')
->orderBy('id', 'desc')
->get();
In the example the data is filtered by "where" and bring records greater than 20 and orderBy catalog by order from high to low.
Solution 11 - Laravel
One interesting thing is multiple order by:
according to laravel docs:
DB::table('users')
->orderBy('priority', 'desc')
->orderBy('email', 'asc')
->get();
this means laravel will sort result based on priority
attribute. when it's done, it will order result with same priority
based on email
internally.
EDIT:
As @HedayatullahSarwary said, it's recommended to prefer Eloquent over QueryBuilder. off course i didn't encourage using QueryBuilder and we all know that each has own usecases.
Any way so why i wrote an answer with QueryBuilder? As we see in eloquent documents:
> You can think of each Eloquent model as a powerful query builder allowing you to fluently query the database table associated with the model.
BTWS the above code with eloquent should be something like this:
Project::orderBy('priority', 'desc')
->orderBy('email', 'asc')
->get();
Solution 12 - Laravel
Try this:
$categories = Category::all()->sortByDesc("created_at");