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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 09:13:20