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

