首页 > 其他 > 详细

laravel框架如何优雅的写出文章的上一篇和下一篇

时间:2020-04-17 00:59:54      阅读:88      评论:0      收藏:0      [点我收藏+]

上一页和下一页的原理

以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
]

可以看出,就是两个查询联合成的一条语句查询。

laravel框架如何优雅的写出文章的上一篇和下一篇

原文:https://www.cnblogs.com/hxsen/p/12717008.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!