Laravel Query Builder与Eloquent查询均返回Null结果求助
问题排查与解决思路
根据你描述的情况,SQL在数据库管理器中能正常返回结果,但Laravel查询返回null,可能的原因及解决办法如下:
1. 时区/日期格式不匹配
这是最常见的问题根源:
- 检查Laravel配置时区(
config/app.php中的timezone项)与数据库时区是否一致。若数据库存储UTC时间,而你传入的start_date是本地时间,会导致日期匹配失效。 - 用
whereDate方法替代直接匹配,它会忽略时间部分仅匹配日期:$drawings = \DB::query() ->select('id') ->from('drawings') ->where('game_id', '=', $game->id) ->whereDate('draw_date', '=', $this->pc->options['start_date']) ->first(); - 借助Carbon统一日期格式,确保与数据库存储格式一致:
use Carbon\Carbon; $date = Carbon::parse($this->pc->options['start_date'])->toDateTimeString(); $drawings = \DB::query() ->select('id') ->from('drawings') ->where('game_id', '=', $game->id) ->where('draw_date', '=', $date) ->first();
2. 模型属性隐藏(仅针对第一种模型查询写法)
如果你使用DrawingsModel查询,检查模型的$hidden属性是否包含id:
// DrawingsModel.php protected $hidden = ['id']; // 若存在该行,会导致id不被返回
解决办法:移除$hidden中的id,或查询时强制显示该字段:
$drawings = DrawingsModel::query() ->select('id') ->from('drawings') ->where('draw_date', '=', $this->pc->options['start_date']) ->makeVisible('id') ->get() ->toArray();
3. 确认查询日志对应当前请求
查询日志可能累积之前的请求记录,导致你看到的并非当前执行的SQL。执行查询前先清空日志:
DB::flushQueryLog(); // 清空旧日志 $drawings = \DB::query() ->select('id') ->from('drawings') ->where('game_id', '=', $game->id) ->where('draw_date', '=', $this->pc->options['start_date']) ->first(); dump(DB::getQueryLog()); // 此时显示的是当前查询的日志
4. 数据类型严格匹配
极少数情况下,数据库字段类型与绑定值类型不匹配会导致问题(比如game_id是字符串类型,但$game->id是整数)。可尝试强制转换类型:
$drawings = \DB::query() ->select('id') ->from('drawings') ->where('game_id', '=', (string)$game->id) ->where('draw_date', '=', $this->pc->options['start_date']) ->first();
内容的提问来源于stack exchange,提问作者Skittles
相关产品推荐
相关产品推荐

