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 fsockopen写的HTTP下载的类
Feb 22 PHP
PHP写杨辉三角实例代码
Jul 17 PHP
php操作redis中的hash和zset类型数据的方法和代码例子
Jul 05 PHP
ThinkPHP控制器里javascript代码不能执行的解决方法
Nov 22 PHP
启用Csrf后POST数据时出现的400错误
Jul 05 PHP
深入讲解PHP的对象注入(Object Injection)
Mar 01 PHP
thinkPHP5.0框架引入Traits功能实例分析
Mar 18 PHP
Eclipse PHPEclipse 配置的具体步骤
Aug 08 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
Nov 17 PHP
PHP基于递归算法解决兔子生兔子问题
May 11 PHP
PHP函数按引用传递参数及函数可选参数用法示例
Jun 04 PHP
PHP xpath()函数讲解
Feb 11 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中读写文件与读写数据库的效率比较分享
2013/10/19 PHP
WordPress分页伪静态加html后缀
2016/06/08 PHP
PHP之十六个魔术方法详细介绍
2016/11/01 PHP
Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()
2019/10/23 PHP
PHP实现简单日历类编写
2020/08/28 PHP
JavaScript初学者应注意的七个细节小结
2012/01/30 Javascript
javascript操作JSON的要领总结
2012/12/09 Javascript
jquery选择器-根据多个属性选择示例代码
2013/10/21 Javascript
javascript 数字格式化输出的实现代码
2013/12/10 Javascript
轻松创建nodejs服务器(5):事件处理程序
2014/12/18 NodeJs
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
jquery捕捉回车键及获取checkbox值与异步请求的方法
2015/12/24 Javascript
使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目
2016/02/15 Javascript
Kindeditor在线文本编辑器如何过滤HTML
2016/04/14 Javascript
js与applet相互调用的方法
2016/06/22 Javascript
js实现图片上传并预览功能
2018/08/06 Javascript
模块化react-router配置方法详解
2019/06/03 Javascript
vue2 拖动排序 vuedraggable组件的实现
2019/08/08 Javascript
layui将table转化表单显示的方法(即table.render转为表单展示)
2019/09/24 Javascript
使用kbone解决Vue项目同时支持小程序问题
2019/11/08 Javascript
vue 实现 rem 布局或vw 布局的方法
2019/11/13 Javascript
[44:21]Ti4 循环赛第四日 附加赛NEWBEE vs LGD
2014/07/13 DOTA
Python中表达式x += y和x = x+y 的区别详解
2017/06/20 Python
python实战教程之自动扫雷
2018/07/13 Python
详解Python打包分发工具setuptools
2019/08/05 Python
卡塔尔航空官方网站:Qatar Airways
2017/02/08 全球购物
欧缇丽加拿大官方网站:Caudalie加拿大
2019/07/18 全球购物
意大利时尚奢侈品店:D’Aniello Boutique
2021/01/19 全球购物
Delphi笔试题
2016/11/14 面试题
服装销售人员求职自我评价
2013/09/26 职场文书
实验室标语
2014/06/21 职场文书
第一批党的群众路线教育实践活动总结报告
2014/07/03 职场文书
教育局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
反四风个人对照检查材料
2014/09/26 职场文书
2015年度物流工作总结
2015/04/30 职场文书
2016五一劳动节慰问信
2015/11/30 职场文书