Laravel Eloquent中created_at时间比较查询异常求助
解决方案
你的问题出在条件分组逻辑错误,orWhere没有和created_at的条件正确关联,导致查询逻辑变成了「满足时间条件且第一个对话组合,或者直接满足第二个对话组合」,所以会返回时间点之前的记录。
正确的写法是把两个对话相关的or条件用闭包包起来,让它和created_at的条件形成AND关系:
$targetUserId = // 你的指定用户ID $cutoffTime = '2024-04-19 21:00:47'; $messages = ChMessage::where('created_at', '>', $cutoffTime) ->where(function ($query) use ($targetUserId) { // 两种对话场景的OR关系 $query->where(function ($q) use ($targetUserId) { $q->where('from_id', 7) ->where('to_id', $targetUserId); })->orWhere(function ($q) use ($targetUserId) { $q->where('from_id', $targetUserId) ->where('to_id', 7); }); }) ->get();
或者更简洁的写法(利用数组条件简化AND判断):
$messages = ChMessage::where('created_at', '>', $cutoffTime) ->where(function ($query) use ($targetUserId) { $query->where(['from_id' => 7, 'to_id' => $targetUserId]) ->orWhere(['from_id' => $targetUserId, 'to_id' => 7]); }) ->get();
额外检查点
- 确认数据库中
created_at字段是datetime/timestamp类型,且存储的时间格式和你传入的'2024-04-19 21:00:47'一致 - 检查Laravel的
config/app.php里的timezone配置,是否和数据库时区匹配,避免时间转换导致的判断错误
内容的提问来源于stack exchange,提问作者Tauseed Zaman
相关产品推荐
相关产品推荐

