如何在 Laravel Eloquent 中对查询结果排序

在本系列的 上一部分中,您了解了如何使用all()方法从 Eloquent 模型中获取数据库记录,您可以使用称为sortDesc()的方法回忆,该方法用于以下降顺序排序记录。

sortDesc() 方法是 Collection 类的一部分,这是一个强大的 Laravel 实用类,它作为原生 PHP 数组的改进版本工作。而不是在数据库查询本身中排序结果,这种方法会扭转集合的顺序,使最后一个项目首先出现在集合中。

要在数据库查询中排序结果,您需要使用orderBy()方法,并提供您想要用作排序的标准的表字段,这将为您提供更多的灵活性来构建一个查询,该查询只会从数据库中获得所需的结果。

现在,您将更改您的routes/web.php文件中的代码,以根据created_at表字段显示从最新的到最旧的结果。

<$>[注意] 当您在表迁移中包含一个timestamps()定义时,无论是created_atupdated_at字段都是由 Eloquent 管理的。

在您的代码编辑器中打开此文件:

1routes/web.php

现在的代码是这样的:

 1[label routes/web.php]
 2<?php
 3
 4use Illuminate\Support\Facades\Route;
 5use App\Models\Link;
 6use App\Models\LinkList;
 7
 8/*
 9|--------------------------------------------------------------------------
10| Web Routes
11|--------------------------------------------------------------------------
12|
13| Here is where you can register web routes for your application. These
14| routes are loaded by the RouteServiceProvider within a group which
15| contains the "web" middleware group. Now create something great!
16|
17*/
18
19Route::get('/', function () {
20    $links = Link::all()->sortDesc();
21    return view('index', [
22        'links' => $links,
23        'lists' => LinkList::all()
24    ]);
25});
26
27Route::get('/{slug}', function ($slug) {
28    $list = LinkList::where('slug', $slug)->first();
29    if (!$list) {
30        abort(404);
31    }
32
33    return view('index', [
34        'list' => $list,
35        'links' => $list->links,
36        'lists' => LinkList::all()
37    ]);
38})->name('link-list');

请注意,负责按 slug 列出链接的 `/{slug} 路径,目前不使用任何分类方法。

如果您现在将多个链接添加到列表中,请求将默认地返回从最旧到最新的排序的结果. 虽然您可以使用 sortDesc() 方法在 $list->links 调用中重新排序集合,但使用 orderBy() 方法提供了更多的灵活性,并允许您在以后添加额外的过滤条件。

将上一代代码样本中的突出行替换为下一行:

1[label routes/web.php]
2'links' => $list->links()->orderBy('created_at', 'desc')->get(),

请注意,这次我们通过调用$list->links()方法来调用内置查询构建程序,这与调用$list->links作为类属性不同,这将调用模型中的魔法方法来获取与该列表相关的所有链接。

这就是完整的routes/web.php文件在完成后应该是什么样子:

 1[label routes/web.php]
 2<?php
 3
 4use Illuminate\Support\Facades\Route;
 5use App\Models\Link;
 6use App\Models\LinkList;
 7
 8/*
 9|--------------------------------------------------------------------------
10| Web Routes
11|--------------------------------------------------------------------------
12|
13| Here is where you can register web routes for your application. These
14| routes are loaded by the RouteServiceProvider within a group which
15| contains the "web" middleware group. Now create something great!
16|
17*/
18
19Route::get('/', function () {
20    $links = Link::all()->sortDesc();
21    return view('index', [
22        'links' => $links,
23        'lists' => LinkList::all()
24    ]);
25});
26
27Route::get('/{slug}', function ($slug) {
28    $list = LinkList::where('slug', $slug)->first();
29    if (!$list) {
30        abort(404);
31    }
32
33    return view('index', [
34        'list' => $list,
35        'links' => $list->links()->orderBy('created_at', 'desc')->get(),
36        'lists' => LinkList::all()
37    ]);
38})->name('link-list');

保存并关闭文件. 现在,使用link:new Artisan 命令添加几个新链接. 你可以使用默认列表:

1docker-compose exec app php artisan link:new
 1[secondary_label Output]
 2 Link URL:
 3 > https://laravel.com/docs/8.x/eloquent
 4
 5 Link Description:
 6 > Laravel Eloquent Docs
 7
 8 Link List (leave blank to use default):
 9 > 
10
11New Link:
12https://laravel.com/docs/8.x/eloquent - Laravel Eloquent Docs
13Listed in: default
14
15 Is this information correct? (yes/no) [no]:
16 > yes
17
18Saved.

如果您重新加载默认链接列表页面,您现在应该从最新的到最旧的链接:

1http://localhost:8000/default

Default Link List showing links ordered by creation date, in descending order - from newest to oldest

同样,如果您更喜欢按链接描述按字母顺序排序链接,则必须更改行以在方法调用中使用该表域:

1'links' => $list->links()->orderBy('description', 'asc')->get(),

以下是链接在这种更改后将如何排序:

Default Link List showing links ordered alphabetically by link description

在本系列的下一部分中,您将学习如何从 Laravel Eloquent 查询中获取总结果数。

Published At
Categories with 技术
comments powered by Disqus