Laravel控制器中Eloquent关联查询返回Null的原因排查
排查Laravel Eloquent查询返回Null的原因
1. 冗余条件导致结果被过滤
你的查询里多了一个完全不必要的错误条件:
->where('notifications.id', 'watt_histories.notification_id')
这个语句是把notifications.id的值和**字符串'watt_histories.notification_id'**做对比,而非关联两个表的字段。你的notifications.id是数字类型,不可能等于这个字符串,直接导致查询结果为空。
2. 关联链数据缺失
即使去掉冗余条件,也要确认整条关联链的数据是否存在:
- 当前登录用户(
Auth::user())有没有对应的rooms记录; - 该
room是否关联了有效的notifications记录; - 对应的
notification是否存在关联的watt_histories记录。
只要其中某一环没有匹配数据,内连接(join)就会返回Null。
3. 关联方式的限制
你使用的是join()(内连接),要求关联的两张表必须同时有匹配数据才会返回结果。如果业务允许某张表无匹配数据仍返回主表内容,需要改用leftJoin(),但从你的需求来看,应该是要找完整关联链的数据,所以优先确认数据完整性。
4. 修正后的查询代码
直接删除那个冗余的where条件即可:
$rooms3 = Room::join("notifications", "notifications.room_id", "rooms.id") ->where('rooms.user_id', Auth::user()->id) ->join("watt_histories", "watt_histories.notification_id", "notifications.id") ->latest('watt_histories.created_at') ->first();
5. 调试技巧
可以用toSql()输出实际执行的SQL语句,复制到数据库客户端直接运行,更直观定位问题:
dd($rooms3->toSql());
内容的提问来源于stack exchange,提问作者VIQRAM ANANTA WATAF
相关产品推荐
相关产品推荐

