You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 8博客应用「旧文章」功能失效的原因及简易修复方案

问题解答

1. Bug产生的原因

你当前的old_article查询用了firstWhere('id', '<', $article->id),这个方法的逻辑是:添加id < 当前文章id的条件后,直接取符合条件的第一条记录。而Laravel的查询默认是按主键id升序排列的,所以符合id < 当前id的记录里,第一条永远是id最小的那篇文章(也就是你看到的id=1的文章),而不是当前文章的「上一篇」——真正的上一篇应该是比当前id小的最大的那个id对应的文章。

举个实际例子:如果当前文章id是5,符合id < 5的文章id有1、2、3、4,默认升序排序后第一条是1,这就导致你每次拿到的都是最早发布的那篇文章,而非真正的上一篇。

2. 最简单的修复方法

只需要调整old_article的查询逻辑,先筛选出id小于当前文章的记录,然后按id降序排序,再取第一条,这样拿到的就是比当前id小的最大的那个,也就是真正的上一篇文章。

修改控制器里的old_article和new_article代码(顺便把new_article改成更严谨的写法,保持逻辑一致性):

// 替换原来的old_article和new_article代码
$old_article = Article::where('id', '<', $article->id)->orderBy('id', 'desc')->first();
$new_article = Article::where('id', '>', $article->id)->orderBy('id', 'asc')->first();

修改后:

  • old_article会拿到比当前文章id小的最大的那篇(上一篇)
  • new_article会拿到比当前文章id大的最小的那篇(下一篇)

如果你的博客希望上下篇按发布时间排序(而非id),只需要把排序字段换成created_at即可,比如:

$old_article = Article::where('created_at', '<', $article->created_at)->orderBy('created_at', 'desc')->first();
$new_article = Article::where('created_at', '>', $article->created_at)->orderBy('created_at', 'asc')->first();

内容的提问来源于stack exchange,提问作者Razvan Zamfir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 18:07:30