Laravel Eloquent:对 all() 的结果进行排序

问题描述 投票:0回答:13

我被困在一项简单的任务上。 我只需要订购来自此通话的结果

$results = Project::all();

其中

Project
是模型。我试过这个

$results = Project::all()->orderBy("name");

但是没有成功。从表中获取所有数据并对其进行排序的更好方法是什么?

laravel laravel-4 eloquent sql-order-by
13个回答
504
投票

您实际上可以在查询中执行此操作。

$results = Project::orderBy('name')->get();

这将以正确的顺序返回所有结果。


157
投票

如果您仍然想使用 all(),您仍然可以使用 sortBy(在集合级别)而不是 orderBy(在查询级别),因为它返回对象集合。

升序排列

$results = Project::all()->sortBy("name");

降序排列

$results = Project::all()->sortByDesc("name");

查看有关集合的文档以了解更多详细信息。

https://laravel.com/docs/5.1/collections


48
投票

此外,为了支持前面的答案,也可以通过添加第二个参数来按降序

desc
或升序
asc
排序。

$results = Project::orderBy('created_at', 'desc')->get();

28
投票

这样做:

$results = Project::orderBy('name')->get();

为什么? 因为它!排序是在数据库中完成的。

不要这样做:

$results = Project::all()->sortBy('name');

为什么? 因为它。首先,行从数据库加载,然后加载到 Laravel 的 Collection 类中,最后在内存中排序。


18
投票

2017年更新


Laravel 5.4 添加了 orderByDesc() 方法来查询构建器:

$results = Project::orderByDesc('name')->get();

13
投票

虽然您需要日期结果作为描述

$results = Project::latest('created_at')->get();

13
投票

在 Laravel Eloquent 中,你必须像下面这样创建查询,它将从数据库中获取所有数据,你的查询不正确:

$results = Project::all()->orderBy("name");

你必须这样使用它:

$results = Project::orderBy('name')->get();

默认情况下,您的数据按升序顺序排列,但您也可以通过以下方式使用orderBy

//---Ascending Order
$results = Project::orderBy('name', 'asc')->get();
//---Descending Order
$results = Project::orderBy('name', 'desc')->get();

5
投票

查看 Eloquent 的

sortBy
方法:http://laravel.com/docs/eloquent


5
投票

注意,你可以这样做:

$results = Project::select('name')->orderBy('name')->get();

这会生成如下查询:

"SELECT name FROM proyect ORDER BY 'name' ASC"

在某些应用中,当数据库未优化且查询比较复杂,并且需要防止在完成的 SQL 中生成 ORDER BY 时,您可以这样做:

$result = Project::select('name')->get();
$result = $result->sortBy('name');
$result = $result->values()->all();

现在是 php 对结果进行排序。


0
投票

您的指令需要打电话来获取,因为它带来了记录和订单按目录

$results = Project::orderBy('name')
           ->get();

示例:

$results = Result::where ('id', '>=', '20')
->orderBy('id', 'desc')
->get();

示例中数据通过“where”过滤,将大于20的记录带入,并按从高到低的顺序排序。


0
投票

试试这个:

$categories     =   Category::all()->sortByDesc("created_at");

0
投票

一个有趣的事情是多重排序:

根据laravel文档

DB::table('users')
   ->orderBy('priority', 'desc')
   ->orderBy('email', 'asc')
   ->get();

这意味着 laravel 将根据

priority
属性对结果进行排序。完成后,它将根据内部
priority
对具有相同
email
的结果进行排序。

编辑:

正如 @HedayatullahSarwary 所说,建议优先选择 Eloquent 而不是 QueryBuilder。当然,我不鼓励使用 QueryBuilder,我们都知道每个都有自己的用例。

那么为什么我用 QueryBuilder 写了一个答案?正如我们在雄辩的文档中看到的那样:

您可以将每个 Eloquent 模型视为功能强大的查询构建器,允许您流畅地查询与模型关联的数据库表。

BTWS 上面的代码用雄辩的方式应该是这样的:

Project::orderBy('priority', 'desc')
->orderBy('email', 'asc')
->get();

0
投票
Category::select('id',
        'category_name',
        'image',
        'type')->orderBy('type', 'asc')->get();
© www.soinside.com 2019 - 2024. All rights reserved.