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

Laravel 5.6如何查询数据库中早于当前日期时间的记录

修正查询逻辑以获取早于当前时间的数据

嘿,看起来你现在的查询逻辑和需求刚好相反,还存在where/orWhere的优先级问题,我来帮你梳理并修正:

问题分析

  • 条件方向错误:你当前用了live_end_time >= $curdate,这是在筛选晚于/等于当前时间的数据,和你要的「早于当前日期时间」需求完全相反,得把运算符改成<
  • 逻辑分组问题:直接混用where和orWhere会导致后续的where条件(比如你没写完的payments相关规则)和OR逻辑产生冲突,必须用闭包把OR条件打包成一个整体,保证逻辑判断正确
  • release_date条件的合理性:原代码里的where('papers.release_date', null)如果是想包含发布日期为空的记录,需要和时间条件一起做OR分组,不然会打乱整体筛选逻辑

修正后的代码示例

$curdate = Carbon::now();
$papers = DB::table('papers')
    ->join('payments', 'papers.id', '=', 'payments.paper_id')
    ->join('tutors', 'papers.tutor_id', '=', 'tutors.id')
    ->select(
        'papers.*',
        'tutors.name',
        DB::Raw('TIMEDIFF(papers.release_date, papers.live_end_time) AS diff')
    )
    // 用闭包分组OR条件,避免和后续WHERE规则冲突
    ->where(function($query) use ($curdate) {
        // 如果你需求是「发布日期为空 或者 直播结束时间早于当前时间」,保留这两行
        $query->whereNull('papers.release_date')
              ->orWhere('papers.live_end_time', '<', $curdate);
        
        // 如果你需求是「仅筛选直播结束时间早于当前时间的记录」,替换成下面这一行即可
        // $query->where('papers.live_end_time', '<', $curdate);
    })
    // 这里补充你没写完的payments相关条件,比如:
    // ->where('payments.status', 'completed')
    ->get();

关键说明

  • 用闭包包裹OR条件是核心,它能确保这部分筛选逻辑是一个独立的判断单元,不会和后续的where规则产生优先级混乱
  • 运算符从>=改为<是贴合需求的关键调整
  • 你可以根据实际业务需求,选择保留或移除whereNull的条件,灵活调整筛选范围

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:56:55