Laravel7 pivot表条件查询赞助房源无结果问题排查
Eloquent 赞助期房源查询无结果修复
错误原因
你当前查询无结果的核心问题是错误使用了whereTime()查询构造器方法:
whereTime()的作用是仅提取日期时间字段的「时:分:秒」部分做数值比较,会直接忽略年、月、日信息,完全无法用来判断完整的时间区间是否覆盖当前时间。- 这种写法会出现两类错误:一是把已过期、未生效的赞助误判为有效,二是当时间的时分秒部分不满足比较条件时,直接过滤掉所有实际在有效期内的赞助记录,最终返回空结果。
修正后的代码
直接使用普通where方法比较完整的日期时间值即可:
$houses = House::with(['position', 'user', 'messages', 'services', 'visualizations', 'sponsorships']) ->whereHas('sponsorships', function($query) { $currentTime = Carbon::now(); $query->where('sponsor_start', '<=', $currentTime) ->where('sponsor_end', '>', $currentTime); }) ->where('is_visible', 1) ->paginate(12);
额外排查点
如果修正后仍有问题,可以按以下顺序核对:
- 确认
House模型中sponsorships关联定义正确,若使用了自定义中间表、非默认外键,需要在关联方法中明确声明参数 - 确认
sponsor_start、sponsor_end字段为datetime或timestamp类型,不要存储为非标准格式的字符串时间,否则会触发字符串比较逻辑导致结果错误 - 可通过查询构造器的
toSql()、getBindings()方法打印最终执行的SQL和绑定参数,确认时间取值、字段名匹配正确
内容的提问来源于stack exchange,提问作者Simone Sada
相关产品推荐
相关产品推荐

