【发布时间】:2013-06-30 01:08:06
【问题描述】:
我被困在一个简单的任务上。 我只需要订购来自此调用的结果
$results = Project::all();
Project 是一个模型。这个我试过了
$results = Project::all()->orderBy("name");
但它没有用。从表中获取所有数据并对其进行排序的更好方法是什么?
【问题讨论】:
标签: laravel laravel-4 eloquent sql-order-by
我被困在一个简单的任务上。 我只需要订购来自此调用的结果
$results = Project::all();
Project 是一个模型。这个我试过了
$results = Project::all()->orderBy("name");
但它没有用。从表中获取所有数据并对其进行排序的更好方法是什么?
【问题讨论】:
标签: laravel laravel-4 eloquent sql-order-by
查看 Eloquent 的 sortBy 方法:http://laravel.com/docs/eloquent
【讨论】:
您实际上可以在查询中执行此操作。
$results = Project::orderBy('name')->get();
这将以正确的顺序返回所有结果。
【讨论】:
get() vs all()的解释:stackoverflow.com/questions/34587457/…
->orderBy('name', 'desc')
此外,为了支持前面的答案,它也可以通过添加作为第二个参数的desc 降序或升序asc 进行排序。
$results = Project::orderBy('created_at', 'desc')->get();
【讨论】:
如果您仍想使用 all(),您仍然可以使用 sortBy(在集合级别)而不是 orderBy(在查询级别),因为它返回一个对象集合。
升序
$results = Project::all()->sortBy("name");
降序
$results = Project::all()->sortByDesc("name");
查看有关集合的文档了解更多详细信息。
【讨论】:
orderBy 相比,广泛使用它会有什么缺点吗?
sortBy() 对集合进行排序是发生在 Laravel 引擎中(在 PHP 中),而 orderBy() 是在数据库中完成的。当然,在几乎所有可以想象的情况下,数据库都会变得更快,并且随着数据集的增加,性能差异也会随之增加。我很想听听其他人对此的看法。
Laravel 5.4 为查询构建器添加了 orderByDesc() 方法:
$results = Project::orderByDesc('name')->get();
【讨论】:
虽然您需要日期的结果为 desc
$results = Project::latest('created_at')->get();
【讨论】:
注意,你可以这样做:
$results = Project::select('name')->orderBy('name')->get();
这会生成如下查询:
"SELECT name FROM proyect ORDER BY 'name' ASC"
在一些应用中,当DB没有优化,查询比较复杂,需要防止在finish SQL中生成ORDER BY,可以这样做:
$result = Project::select('name')->get();
$result = $result->sortBy('name');
$result = $result->values()->all();
现在是 php 对结果进行排序。
【讨论】:
这样做:
$results = Project::orderBy('name')->get();
为什么? 因为它快速!排序在数据库中完成。
不要这样做:
$results = Project::all()->sortBy('name');
为什么? 因为它慢。首先,从数据库中加载行,然后加载到 Laravel 的 Collection 类中,最后在内存中排序。
【讨论】:
您的指令需要调用才能获取,因为它是通过目录带来的记录和订单
$results = Project::orderBy('name')
->get();
例子:
$results = Result::where ('id', '>=', '20')
->orderBy('id', 'desc')
->get();
在示例中,数据按“where”过滤,并带来大于 20 的记录和 orderBy 目录按顺序从高到低。
【讨论】:
试试这个:
$categories = Category::all()->sortByDesc("created_at");
【讨论】:
一个有趣的事情是多重排序:
根据laravel docs:
DB::table('users')
->orderBy('priority', 'desc')
->orderBy('email', 'asc')
->get();
这意味着 laravel 将根据 priority 属性对结果进行排序。完成后,它将在内部根据email 以相同的priority 排序结果。
编辑:
正如@HedayatullahSarwary 所说,建议您更喜欢 Eloquent 而不是 QueryBuilder。当然,我不鼓励使用 QueryBuilder,我们都知道每个都有自己的用例。
为什么我用 QueryBuilder 写了一个答案?正如我们在eloquent documents 中看到的:
您可以将每个 Eloquent 模型视为一个强大的查询构建器,让您可以流畅地查询与模型关联的数据库表。
BTWS 上面带有 eloquent 的代码应该是这样的:
Project::orderBy('priority', 'desc')
->orderBy('email', 'asc')
->get();
【讨论】:
在 Laravel Eloquent 中,您必须像下面的查询一样创建它会从数据库中获取所有数据,您的查询不正确:
$results = Project::all()->orderBy("name");
你必须这样使用它:
$results = Project::orderBy('name')->get();
默认情况下,您的数据按升序顺序排列,但您可以按以下方式使用它:
$results = Project::orderBy('name', 'asc')->get();
或按降序顺序:
$results = Project::orderBy('name', 'desc')->get();
【讨论】: