Laravel 框架如何優雅的寫出文章的上一篇和下一篇

houxin發表於2020-04-17

上一頁和下一頁的原理

以id排序,獲取排序在當前id的上一篇文章的資訊,以及當前id的下一篇文章的資訊。

一、簡單直接方式

$last = Article::where('id', '<', $info->id)->orderBy('id', 'desc')->first();
$next = Article::where('id', '>', $info->id)->orderBy('id', 'asc')->first();

能生成取到兩個文章的資料。

二、升級方式

$last = Article::where('id', '<', $info->id)->latest('id')->first();
$next = Article::where('id', '>', $info->id)->oldest('id')->first();

使用laravel內建的latestoldest來代替orderBy,看起來優雅了一點,但是做的事情,跟上面的那個方式一樣。分兩次請求資料庫,進而獲取兩篇文章資訊。

三、再次升級

$sql = Article::where('id', '<', $info->id)->latest('id')->take(1);
$list = Article::where('id', '>', $info->id)->oldest('id')->take(1)->union($sql)->orderBy('id', 'asc')->get();

同樣能獲取到上一篇和下一篇的兩篇文章。在不丟失優雅姿態的同時,使用union方法,將兩個查詢聯合成了一個,減少了資料庫的請求壓力。
同時使用orderBy的方法對查詢到的兩個資料,進行了排序。上一篇的文章資訊就是下標為0的那隻。下一篇的文章資訊,就是下標為1的那隻。

使用下面的->dd()方式列印出的mysql的語句詳情。

$list = Article::where('id', '>', $info->id)->oldest('id')->take(1)->union($sql)->orderBy('id', 'asc')->dd();

結果如下:

(select * from `articles` where `id` > ? order by `id` asc limit 1) union (select * from `articles` where `id` < ? order by `id` desc limit 1) order by `id` asc
array:2 [0 => 3
  1 => 3
]

可以看出,就是兩個查詢聯合成的一條語句查詢。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章