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

Laravel控制器用Eloquent按年份查询无结果,求排查方案

排查Laravel Eloquent查询无结果的问题

问题背景

需要从数据库获取预订年份为2022的数据,字段tanggal_take格式为'Y-m-d',原生SQL语句SELECT * FROM table_name WHERE YEAR(tanggal_take) = "2022";可正常查到4条数据,但使用Laravel Eloquent关联查询时始终返回0条结果,当前代码如下:

$data = Booking::join('users', 'users.id', '=', 'bookings.id_member')
                ->join('packages', 'packages.kode_paket', '=', 'bookings.kode_paket')
                ->where( DB::raw('YEAR(bookings.tanggal_take)'), '=', $request->range )
                ->get(['bookings.*', 'packages.*', 'users.*']);

也曾尝试改用->whereYear('bookings.tanggal_take', '=', $request->range ),结果依旧为空。

排查步骤

  • 确认$request->range的实际值
    直接输出dd($request->range),检查是否为"2022"或2022。如果传入的是错误格式(如"2022年")或空值,会导致匹配失败。
  • 查看生成的SQL语句
    在查询后添加dd($data->toSql(), $data->getBindings()),或开启Laravel查询日志,对比生成的SQL与可用原生SQL的差异:
    • 检查表名、字段名是否拼写错误(比如bookings.tanggal_take是否正确)
    • 验证JOIN条件是否合理,INNER JOIN会自动排除关联表中无匹配的数据。可临时将join()改为leftJoin(),看是否能返回数据,以此判断是否是关联条件过滤了结果。
  • 检查字段数据类型
    确认tanggal_take在数据库中是DATE/DATETIME类型,而非字符串类型。如果是字符串,YEAR()函数无法正确解析,需先转换为日期类型再提取年份,示例:DB::raw('YEAR(STR_TO_DATE(bookings.tanggal_take, "%Y-%m-%d"))')。
  • 单独测试Booking表查询
    去掉JOIN语句,仅查询Booking表:
    $test = Booking::whereYear('tanggal_take', 2022)->get();
    dd($test->count());
    
    如果该查询能返回4条数据,说明问题出在JOIN关联逻辑上;如果仍返回0,则是Booking表的查询条件存在问题。
  • 排查全局作用域干扰
    查看Booking模型是否设置了全局作用域(如默认过滤状态为激活的数据),这类默认条件会自动附加到查询中,可能过滤掉目标数据。可在查询时添加->withoutGlobalScopes()排除干扰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:30:51