在本系列的 上一部分中,您了解了如何使用all()
方法从 Eloquent 模型中获取数据库记录,您可以使用称为sortDesc()
的方法回忆,该方法用于以下降顺序排序记录。
sortDesc()
方法是 Collection 类的一部分,这是一个强大的 Laravel 实用类,它作为原生 PHP 数组的改进版本工作。而不是在数据库查询本身中排序结果,这种方法会扭转集合的顺序,使最后一个项目首先出现在集合中。
要在数据库查询中排序结果,您需要使用orderBy()
方法,并提供您想要用作排序的标准的表字段,这将为您提供更多的灵活性来构建一个查询,该查询只会从数据库中获得所需的结果。
现在,您将更改您的routes/web.php
文件中的代码,以根据created_at
表字段显示从最新的到最旧的结果。
<$>[注意]
当您在表迁移中包含一个timestamps()
定义时,无论是created_at
或updated_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
同样,如果您更喜欢按链接描述按字母顺序排序链接,则必须更改行以在方法调用中使用该表域:
1'links' => $list->links()->orderBy('description', 'asc')->get(),
以下是链接在这种更改后将如何排序:
在本系列的下一部分中,您将学习如何从 Laravel Eloquent 查询中获取总结果数。