Laravel Eloquent关联关系中使用whereBetween筛选指定记录仪时间段内测量数据的问题
解决Laravel中关联模型的时间范围筛选问题
嘿,我完全懂你现在的困扰:你想拿到指定记录仪下、特定时间段内的传感器及其对应测量数据,但直接在主查询里用whereBetween去过滤关联关系根本不起作用对吧?
问题出在哪?
你当前的代码里,把whereBetween用在了关联关系名称getMeasurementsRelation上,但whereBetween是针对当前模型(Sensor)的字段的方法,它没办法直接处理关联模型的筛选逻辑。这就是为什么去掉这部分能拿到全部数据,但加了就失效的原因。
正确的实现方式
要筛选关联的测量数据,你需要在with方法里传入闭包,对关联模型的查询进行限定。如果还需要确保只返回有符合时间范围测量数据的传感器,可以搭配whereHas使用:
public function getChart(Request $request) { $sensorCollection = Sensor::where('recorder_id', $request->recorder_id) // 筛选关联的测量数据时间范围 ->with(['getMeasurementsRelation' => function ($query) use ($request) { $query->whereBetween('timestamp', [$request->start_chart, $request->end_chart]); }]) // 可选:只保留有符合条件测量数据的传感器(如果需要的话) ->whereHas('getMeasurementsRelation', function ($query) use ($request) { $query->whereBetween('timestamp', [$request->start_chart, $request->end_chart]); }) ->get(); return $sensorCollection; }
代码解释
with里的闭包:负责在加载关联的getMeasurementsRelation时,只查询时间在start_chart和end_chart之间的测量数据。whereHas(可选):如果你的需求是只返回存在符合条件测量数据的传感器,就加上这部分;如果需要保留所有传感器(哪怕没有对应时间段的数据),可以去掉这一行。
你的Sensor模型里的关联定义是没问题的,不需要修改:
public function getMeasurementsRelation() { return $this->hasMany('App\Models\measurement', 'sensor_id', 'id'); }
这样调整后,就能准确获取到指定记录仪下、指定时间段内的传感器及其关联测量数据啦!
内容的提问来源于stack exchange,提问作者vennot_be
相关产品推荐
相关产品推荐

