如何按日期获取上/下一条新闻记录?解决同日多条新闻兼容问题
解决同日期多条新闻时的上下篇获取问题
当前代码仅通过whereDate比较日期,当同一天发布多条新闻时,无法区分同日期内的新闻顺序,导致上下篇数据获取错误。以下是修正后的实现方案:
修正后的代码实现
NewsController.php
public function detail($slug){ $news = \App\News::active()->where('slug', $slug)->firstOrFail(); // 获取上一条新闻(发布时间更晚/同日期内排序更靠后的) $prev_news = \App\News::active() ->where(function ($query) use ($news) { $query->where('date', '>', $news->date) ->orWhere(function ($subQuery) use ($news) { $subQuery->whereDate('date', '=', $news->date) ->where('id', '>', $news->id); }); }) ->orderBy('date', 'desc') ->orderBy('id', 'desc') ->first(); // 获取下一条新闻(发布时间更早/同日期内排序更靠前的) $next_news = \App\News::active() ->where(function ($query) use ($news) { $query->where('date', '<', $news->date) ->orWhere(function ($subQuery) use ($news) { $subQuery->whereDate('date', '=', $news->date) ->where('id', '<', $news->id); }); }) ->orderBy('date', 'desc') ->orderBy('id', 'desc') ->first(); return view('news.detail', compact('news', 'prev_news', 'next_news')); }
关键修改说明
- 新增嵌套查询逻辑:先判断日期是否大于/小于当前新闻日期;若日期相同,则通过
id(自增ID默认对应发布顺序)区分同日期内的新闻顺序。 - 双重排序规则:同时按
date和id排序,确保同日期内的新闻能按照发布先后正确排列。
自定义调整提示
如果你的新闻模型中,同日期内的排序依赖其他字段(比如精确到时分秒的published_at、自定义排序值sort_order),只需将代码中的id替换为对应字段即可。
内容的提问来源于stack exchange,提问作者Wilson
相关产品推荐
相关产品推荐

