Reputation: 16430
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?
Upvotes: 297
Views: 366207
Reputation: 536
Using eloquent. Can specify sort order asc/desc for a specific/multiple columns.
Category::select('id',
'category_name',
'image',
'type')->orderBy('type', 'asc')->get();
Upvotes: 0
Reputation: 2844
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 also use orderBy in the following ways:
//---Ascending Order
$results = Project::orderBy('name', 'asc')->get();
//---Descending Order
$results = Project::orderBy('name', 'desc')->get();
Upvotes: 16
Reputation: 723
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();
Upvotes: 1
Reputation: 7760
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.
Upvotes: 30
Reputation: 1722
Try this:
$categories = Category::all()->sortByDesc("created_at");
Upvotes: 0
Reputation: 1
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.
Upvotes: 0
Reputation: 2296
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();
Upvotes: 48
Reputation: 69
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.
Upvotes: 5
Reputation: 2328
While you need result for date as desc
$results = Project::latest('created_at')->get();
Upvotes: 14
Reputation: 11069
Laravel 5.4 added orderByDesc() methods to query builder:
$results = Project::orderByDesc('name')->get();
Upvotes: 18
Reputation: 2846
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.
https://laravel.com/docs/5.1/collections
Upvotes: 166
Reputation: 5288
You can actually do this within the query.
$results = Project::orderBy('name')->get();
This will return all results with the proper order.
Upvotes: 518
Reputation: 9142
Check out the sortBy
method for Eloquent: http://laravel.com/docs/eloquent
Upvotes: 5