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

Laravel如何将Eloquent日期筛选计数查询改写为原生查询

错误原因

你的原生查询触发语法错误,核心是SQL结构不符合规范:SELECT子句内只能声明要查询的字段、聚合运算表达式,不能直接写入WHERE过滤逻辑,条件判断必须放在独立的WHERE语句块中。
另外你原写法用NOW()做比较也和原Eloquent逻辑有偏差:whereDate方法会自动忽略字段的时分秒部分,仅按日期维度匹配,Carbon::today()返回的是纯日期格式值,NOW()返回带当前精确时分秒的时间,匹配逻辑不一致。

正确写法

写法1:查询构造器搭配原生表达式(推荐,和原Eloquent逻辑完全对齐)

用参数绑定传值可以避免SQL注入风险,执行逻辑和你最初的Eloquent查询1:1对应:

// 如果需要基于模型查询,把DB::table('表名')替换为(new Model())即可
$data = DB::table('模型对应的数据表名')
    ->selectRaw('COUNT(id) as countData')
    ->whereRaw('DATE(start_date) <= ?', [Carbon::today()->toDateString()])
    ->whereRaw('DATE(end_date) >= ?', [Carbon::today()->toDateString()])
    ->first()
    ->countData;

写法2:直接执行完整原生SQL

如果要写完整原生语句,通过DB::select调用即可,用CURDATE()直接获取MySQL端的当日日期,和Carbon::today()效果完全一致:

$result = DB::select("
    SELECT COUNT(id) as countData
    FROM 模型对应的数据表名
    WHERE DATE(start_date) <= CURDATE()
    AND DATE(end_date) >= CURDATE()
");
$count = $result[0]->countData;
优化提示
  • SQL有固定的子句书写顺序,SELECT、FROM、WHERE等模块必须按规范排列,否则会直接报语法错误
  • 变量传入SQL时优先使用参数绑定,不要直接把值拼接进SQL字符串,避免SQL注入风险
  • 如果start_date、end_date字段本身是DATE类型(而非DATETIME/TIMESTAMP),可以去掉字段外层的DATE()函数包裹,能直接命中字段索引,提升查询效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:48:56