欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

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

Laravel Eloquent取上一条和下一条数据

此文章为原创文章,未经同意,禁止转载。

由于这个取得下一条和取得上一条的记录其实在日常的开发当中还是会经常遇到,最常见的场景可能就是取得一篇文章的上一篇文章和下一篇文章了。其实这个在LaravelEloquent中实现还是挺容易的,不过由于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>

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

Happy Hacking

本文由 JellyBool 创作,未经同意,禁止转载和引用。
Ctrl 

但是如果不是以ID 来做文章的键

如果是slug这种文字 如何获取上一条 和 下一条

yurenzhen 

如果是使用UUID ,或者是乱序的,怎么生成下一条和上一条呢? 求 楼主解答,谢谢楼主~

JellyBool 回复 @yurenzhen 

不管是 uuid 还是乱序的,都是唯一的吧。也是可以根据 id 返回一个 collection,再从 collection 取你的 uuid 或者乱序的就可以了吧

genyii 

弱弱的问一句,Happy Hacking是什么意思?

来自 https://www.laravist.com/blog/post/laravel-get-next-and-prev-posts-with-eloquent

 

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

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

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

取得上一篇的文章id

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

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

取得上一篇的文章id

1
2
3
4
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来判读是否将文章展示出来。

比如说查询语句:

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

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

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

View展示:

1
2
3
4
5
6
7
8
9
10
11
<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>

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

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

来自 http://www.jb51.net/article/70038.htm


普通分类: