当前位置:首页 > CMS教程 > 其它CMS > 列表

Laravel Eloquent取上一条和下一条数据的id实现讲解

发布:smiling 来源: PHP粉丝网  添加日期:2023-10-16 18:21:08 浏览: 评论:0 

首先文章的起源来于一个问题:

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

我想获取下一条把它的active字段更改为yes,但是这样貌似获取不到

$next_active = $ips->where("id", ">", $ips_get->id)->first();

$next_active->update(["active" => "yes"]);

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

取得上一篇的文章id

  1. protected function getPrevArticleId($id
  2.     { 
  3.         return Article::where('id''<'$id)->max('id'); 
  4.     } 

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

取得下一篇的文章id

  1. protected function getNextArticleId($id
  2.     { 
  3.         return Article::where('id''>'$id)->min('id'); 
  4.     } 

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

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

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

多说两句

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

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

比如说查询语句:

  1. public function scopePublished($query
  2.     { 
  3.         $query->where('published_at','<=',Carbon::now()); 
  4.     } 
  5. //以上方法位于Article中,下面的查询我放在了ArticleController中 
  6. $articles = Article::latest('published_at')->published()... 

View展示

  1. <li class="previous"
  2. @if($prev_article
  3. <a href="/post/{{ $prev_article->slug }}" rel="external nofollow"  rel="prev"><i class="fa fa-chevron-left"></i><strong>上一篇</strong><span>  {{ $prev_article->title }}</span> </a> 
  4. @endif 
  5. </li> 
  6. <li class="next"
  7. @if($next_article && $next_article->published_at < Carbon\Carbon::now()) 
  8. <a href="/post/{{ $next_article->slug }}" rel="external nofollow"  rel="next"><i class="fa fa-chevron-right"></i><strong>下一篇</strong> <span>  {{ $next_article->title }}</span></a> 
  9. @endif 
  10. </li> 

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

Tags: Laravel上一条 Laravel下一条 Eloquent

分享到: