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
相关产品推荐
相关产品推荐

