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

Laravel 8.73 如何判断eventaries表活动start日期是否过期并过滤

问题原因分析
  • 现有过滤逻辑完全不生效:你在foreach遍历中只要遇到第一个未过期的活动,就直接把全部未过滤的$events集合传给视图,不会剔除已过期的活动条目。
  • 时间生成格式错误:你用的date('Y-m-t h:m:s')存在多处格式错误,t代表当月最后一天,h是12小时制,m是月份不是分钟,会导致时间对比完全不符合预期,正确的datetime格式应为Y-m-d H:i:s,在Laravel中更推荐直接用now()助手函数生成当前时间,自动适配数据库时间字段格式。
  • 字符串对比风险:如果数据库eventaries表的start字段是datetime/timestamp类型,直接用字符串对比容易因为格式不匹配出现判断错误。
解决方案

推荐优先使用SQL层面过滤的方案,性能最优也最稳定:

if ($course == 'specific-course') {
    // 注意原代码里的视图路径拼写错误,specific少写了一个i,按需修正
    $view = 'pages.course.specific-course';
    $id = '8';
}

// 生成当前时间
$currentDate = now();

// 查询时直接过滤已过期的活动
$events = DB::table('eventaries')
    ->where('category', $id)
    ->where('start', '>', $currentDate)
    ->get();

// 直接传递过滤后的结果到视图
return view($view, [
    "events" => $events,
]);

如果你的业务逻辑需要先查询全量活动再做过滤,可以用Laravel集合的filter方法处理:

if ($course == 'specific-course') {
    $view = 'pages.course.specific-course';
    $id = '8';
}

$currentDate = now();
// 先查询全量活动
$events = DB::table('eventaries')->where('category', $id)->get();

// 过滤掉已过期的活动
$filteredEvents = $events->filter(function ($event) use ($currentDate) {
    return $event->start > $currentDate;
});

// 传递过滤后的结果到视图
return view($view, [
    "events" => $filteredEvents,
]);

如果你要手动写foreach实现过滤,正确写法是先声明空容器存储符合条件的活动,遍历完成后再返回视图,不要在遍历中途return:

$filteredEvents = [];
foreach ($events as $event) {
    if ($event->start > $currentDate) {
        $filteredEvents[] = $event;
    }
}
return view($view, [
    "events" => $filteredEvents,
]);

上述方案实现后,你的Blade模板无需修改,直接遍历$events即可正常渲染未过期的活动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:24:04