Laravel Eloquent:获取『上一条』/『下一条』记录 ID 0 个改进

我们经常会有比如在当前页显示下一篇,或者上一篇文章这样的这样的需求,你可以像下面这样:

...

public function show($id)
{
    // 获取当前文章
    $current = Post::find($id);

    // 获取 “上一篇” 的 ID
    $previousPostID = Post::where('id', '<', $id)->max('id');

    // 同理,获取 “下一篇” 的 ID
    $nextPostId = Post::where('id', '>', $id)->min('id');

    return view('post.show', compact('current', 'previousPostID', 'nextPostId'));
}
...

然后就可以在模板里放好相应的链接了:

<a href="/post/{$previousPostID}">上一篇</a> | <a href="/post/{$nextPostId}">下一篇</a>
本文为 Wiki 文章,邀您参与纠错、纰漏和优化
讨论数量: 23
xingchen
public function show(Post $db,$id)
{
    // 获取当前文章
    $current = $db->find($id);

    // 获取 “上一篇” 的 ID
    $previousPostID = $db->where('id', '<', $id)->max('id');

    // 同理,获取 “下一篇” 的 ID
    $nextPostId = $db->where('id', '>', $id)->min('id');

    return view('post.show', compact('current', 'previousPostID', 'nextPostId'));
}

应该这样写才对,你这种写法会new3个对象

5年前 评论
$item['prev'] = self::query()
    ->where('id', '<', $item['id'])
    ->orderBy('id','desc')
    ->first(['id', 'title','model_id']);
$item['next'] = self::query()
    ->where('id', '>', $item['id'])
    ->orderBy('id','asc')
    ->first(['id', 'title','model_id']);

有时候我们并不需要单纯的ID,可能还会展示其他字段

5年前 评论
xingchen
public function show(Post $db,$id)
{
    // 获取当前文章
    $current = $db->find($id);

    // 获取 “上一篇” 的 ID
    $previousPostID = $db->where('id', '<', $id)->max('id');

    // 同理,获取 “下一篇” 的 ID
    $nextPostId = $db->where('id', '>', $id)->min('id');

    return view('post.show', compact('current', 'previousPostID', 'nextPostId'));
}

应该这样写才对,你这种写法会new3个对象

5年前 评论
$item['prev'] = self::query()
    ->where('id', '<', $item['id'])
    ->orderBy('id','desc')
    ->first(['id', 'title','model_id']);
$item['next'] = self::query()
    ->where('id', '>', $item['id'])
    ->orderBy('id','asc')
    ->first(['id', 'title','model_id']);

有时候我们并不需要单纯的ID,可能还会展示其他字段

5年前 评论

@xingchen 用的静态方法,不会new3个对象吧,恳请指教

5年前 评论

为什么不直接用框架自带的分页功能?

$results->nextPageUrl()
$results->previousPageUrl()

分页《Laravel 5.7 中文文档》

5年前 评论

只是拿ID为啥不用参数直接运算得到还要去查库??

5年前 评论
panda-sir

@Sky-Eye 1. id可能不连续 2. 可能不只是需要id :simple_smile:

5年前 评论

post 如果数量很大是需要把所有的都查出来然后计算取 max 把?

4年前 评论

@xingchen 这样是不是查了 3 次数据库?

4年前 评论

如果想要按照别的排序进行上一条,下一条,这种方式好像实现不了,有没有更完美的解决方案呢

5年前 评论

@Kevinvinvin 确实是我理解有问题,感谢指出

5年前 评论

@徐小花 你说的是上一页、下一页,本帖说的是上一条、下一条,性质不一样

5年前 评论

再写两个方法...或者加个参数

5年前 评论

@Summer 我觉得上一条、下一条的最佳实践应该是用框架自带的分页功能,这样的内容放到社区wiki中会不会误导新人。

5年前 评论

@di-gua 是了,刚刚看了一下,确实是调用了Model的__callStatic

5年前 评论

@Caral 那个不是静态方法。 调用了__callStatistic 方法,new 了对象

5年前 评论
newbing

max 是聚集函数吧,不知道 orderby + limit(1) 会更快、更稳定一些呢。

5年前 评论

@panda-sir 好像是这么回事。

5年前 评论

感谢分享啊啊啊啊啊。。。。正好需要这个功能,自己的写的比较 low,还是你这个简单 :laughing:
我要去改进成为你的写法了。。。

 $priorGoods = Goods::where([
                ['goods_id', '>', $request->goods_id]
            ]) - orderBy('id', 'desc')->limit(1)->value('id');
5年前 评论
ThinkQ

谢谢,狠有拥。

5年前 评论
调调

@Caral 不会

5年前 评论

这个操作666

5年前 评论

@xingchen 代码格式调整一下吧兄弟

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!