Laravel 中获取上一篇和下一篇数据


Posted in PHP onJuly 27, 2015

首先文章的起源来与SF上面的一个问题:

Laravel的Eloquent ORM 怎么获取当前记录的下一条

然后,当时在答案里面简单写了一下解决方案。不过由于这个取得下一条和取得上一条的记录其实在日常的开发当中还是会经常遇到,最常见的场景可能就是取得一篇文章的上一篇文章和下一篇文章了。其实这个在Laravel的Eloquent中实现还是挺容易的,不过由于Laravel并没有直接提供给我们相应的方法,我们得使用一个小小的技巧:

取得上一篇的文章id

protected function getPrevArticleId($id)
  {
    return Article::where('id', '<', $id)->max('id');
  }

$id就是当前文章的id,我们通过max()来取得比当前id小的最大值,也就是当前id的前一篇文章的id。

取得上一篇的文章id

protected function getNextArticleId($id)
  {
    return Article::where('id', '>', $id)->min('id');
  }

基本上可以说是:同理可得。这个取得下一篇文章的id其实就是一个相反的过程,理解万岁。

一旦我们取得上一篇和下一篇的文章id之后,我们就可以随心所欲了,比如:

$next_article = Article::find($this->getNextArticleId($article->id));

多说两句

那如果是对于一个文章的管理来说,我们其实可以这么做:

给articles表中增加一个published_at的字段,这里可以将published_at字段设置为一个Carbon对象,然后我们在前端展示的时候就可以根据published_at来判读是否将文章展示出来。

比如说查询语句:

public function scopePublished($query)
  {
    $query->where('published_at','<=',Carbon::now());
  }

//以上方法位于Article中,下面的查询我放在了ArticleController中

$articles = Article::latest('published_at')->published()...

View展示:

<li class="previous">
@if($prev_article)
<a href="/post/{{ $prev_article->slug }}" rel="prev"><i class="fa fa-chevron-left"></i><strong>上一篇</strong><span> {{ $prev_article->title }}</span> </a>
@endif
</li>
<li class="next">
@if($next_article && $next_article->published_at < Carbon\Carbon::now())

<a href="/post/{{ $next_article->slug }}" rel="next"><i class="fa fa-chevron-right"></i><strong>下一篇</strong> <span> {{ $next_article->title }}</span></a>
@endif
</li>

处理文章的前一篇和后一篇的解决方案已完成。

以上所述就是本文的全部内容了,希望大家能够喜欢。

PHP 相关文章推荐
PHP IPV6正则表达式验证代码
Feb 16 PHP
PHP中使用Session配合Javascript实现文件上传进度条功能
Oct 15 PHP
完美解决thinkphp验证码出错无法显示的方法
Dec 09 PHP
yii2.0之GridView自定义按钮和链接用法
Dec 15 PHP
将PHP从5.3.28升级到5.3.29时Nginx出现502错误
May 09 PHP
如何用PHP来实现一个动态Web服务器
Jul 29 PHP
PHP MYSQL实现登陆和模糊查询两大功能
Feb 05 PHP
PHP使用内置函数生成图片的方法详解
May 09 PHP
Laravel框架实现的rbac权限管理操作示例
Jan 16 PHP
PDO::errorCode讲解
Jan 28 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
Mar 06 PHP
Thinkphp 框架扩展之应用模式实现方法分析
Apr 27 PHP
php实现将Session写入数据库
Jul 26 #PHP
php检测文本的编码
Jul 26 #PHP
PHP中COOKIES使用示例
Jul 26 #PHP
PHP实现简单数字分页效果
Jul 26 #PHP
FastCGI 进程意外退出造成500错误
Jul 26 #PHP
php实现QQ空间获取当前用户的用户名并生成图片
Jul 25 #PHP
使用纯php代码实现页面伪静态的方法
Jul 25 #PHP
You might like
PHP连接操作access数据库实例
2015/03/30 PHP
php格式化时间戳
2016/12/17 PHP
PHP实现随机数字、字母的验证码功能
2018/08/01 PHP
js 页面刷新location.reload和location.replace的区别小结
2009/12/24 Javascript
jQuery+ajax实现顶一下,踩一下效果
2010/07/17 Javascript
jQuery实现切换页面布局使用介绍
2011/10/09 Javascript
javascript使用百度地图api和html5特性获取浏览器位置
2014/01/10 Javascript
LABjs、RequireJS、SeaJS的区别
2014/03/04 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
2014/12/31 Javascript
Jquery检验手机号是否符合规则并根据手机号检测结果将提交按钮设为不同状态
2015/11/26 Javascript
jQuery+canvas实现简单的球体斜抛及颜色动态变换效果
2016/01/28 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
微信小程序 摇一摇抽奖简单实例实现代码
2017/01/09 Javascript
jQuery中layer分页器的使用
2017/03/13 Javascript
Express之get,pos请求参数的获取
2017/05/02 Javascript
MvcPager分页控件 适用于Bootstrap
2017/06/03 Javascript
详解nodejs的express如何自动生成项目框架
2017/07/12 NodeJs
详解webpack + react + react-router 如何实现懒加载
2017/11/20 Javascript
Nodejs Express 通过log4js写日志到Logstash(ELK)
2018/08/30 NodeJs
vue 利用路由守卫判断是否登录的方法
2018/09/29 Javascript
TypeScript中的方法重载详解
2019/04/12 Javascript
pm2发布node配置文件ecosystem.json详解
2019/05/15 Javascript
Python中的面向对象编程详解(上)
2015/04/13 Python
Pycharm远程调试openstack的方法
2017/11/21 Python
TensorFlow 模型载入方法汇总(小结)
2018/06/19 Python
Python多线程threading join和守护线程setDeamon原理详解
2020/03/18 Python
伦敦最著名的老字号百货公司:Selfridges(塞尔福里奇百货)
2016/07/25 全球购物
GLAMGLOW香港官网:明星出镜前的秘密武器
2017/03/16 全球购物
澳大利亚最好的厨具店:Kitchen Warehouse
2018/03/13 全球购物
澳大利亚墨水站Ink Station:墨水和碳粉打印机墨盒
2019/03/24 全球购物
意大利在线药房:Farmacia Loreto Gallo
2019/08/09 全球购物
shallow copy和deep copy的区别
2016/05/09 面试题
《彩色世界》教学反思
2014/04/12 职场文书
汽车检测与维修专业求职信
2014/07/04 职场文书
mapstruct的用法之qualifiedByName示例详解
2022/04/06 Java/Android
Django + Taro 前后端分离项目实现企业微信登录功能
2022/04/07 Python