Laravel中移除发布超30天博客文章的‘new’标签问题
问题分析与解决方案
原代码失效的核心问题有两个:
- 循环内重复查询整个
post表,判断的是是否存在任意一篇超过30天的文章,而非当前循环的这篇文章是否超时 DATEDIFF(created_at, now())的参数顺序搞反了,这个函数返回第一个日期减第二个日期的天数,正常发布的文章created_at早于now,结果会是负数,永远满足不了>30的条件
正确写法(Laravel 推荐方式)
直接利用Eloquent模型自带的Carbon日期对象判断,简洁高效:
@foreach ($post as $p) <div class="post-title"> {{ $p->title }} {{-- 仅当发布时间不超过30天时显示new标签 --}} @if ($p->created_at->diffInDays(now()) <= 30) <img src="{{ asset('assets/new.gif') }}" alt="New"> @endif </div> @endforeach
备选方案(如果$post是数组而非模型实例)
如果你的$post是DB查询返回的数组(不是Eloquent模型),需要先把日期字符串转成Carbon对象:
@foreach ($post as $p) <div class="post-title"> {{ $p['title'] }} @if (\Carbon\Carbon::parse($p['created_at'])->diffInDays(now()) <= 30) <img src="{{ asset('assets/new.gif') }}" alt="New"> @endif </div> @endforeach
关键注意点
- 确认
asset('assets/new.gif')路径正确,对应项目中GIF文件的实际位置 - 别在循环里执行DB查询(原代码的
\DB::table('post')->whereRaw(...)),会产生大量重复查询,拖慢页面性能
内容的提问来源于stack exchange,提问作者mne
相关产品推荐
相关产品推荐

