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表:
如果该查询能返回4条数据,说明问题出在JOIN关联逻辑上;如果仍返回0,则是Booking表的查询条件存在问题。$test = Booking::whereYear('tanggal_take', 2022)->get(); dd($test->count()); - 排查全局作用域干扰
查看Booking模型是否设置了全局作用域(如默认过滤状态为激活的数据),这类默认条件会自动附加到查询中,可能过滤掉目标数据。可在查询时添加->withoutGlobalScopes()排除干扰。
内容的提问来源于stack exchange,提问作者Yudha Restu
相关产品推荐
相关产品推荐

