如何正确遍历Laravel查询返回的Result Object?
问题原因与解决方法
你当前的问题出在first()方法的使用上:first()返回的是单个Eloquent模型实例,而非可遍历的集合。当你对这个模型实例执行foreach遍历时,实际是在遍历模型的内置公共属性(比如incrementing、exists这些),不是你数据库里存储的祈祷时间字段,这就是输出出现奇怪键值对的原因。
正确处理方式分两种情况:
情况1:确定只会返回单条记录
直接从模型实例中提取所需字段,无需遍历:
$prayer = Prayer_time::where('mosque_id', $request->mosque_id) ->where('month', $month) ->where('date', $date) ->first(); // 方式1:手动提取指定字段(假设模型有fajr、dhuhr等祈祷时间字段) $prayer_times = []; if ($prayer) { $prayer_times['fajr'] = $prayer->fajr; $prayer_times['dhuhr'] = $prayer->dhuhr; // 其他字段按需添加 } // 方式2:直接转成仅含数据库字段的数组(过滤模型内置属性) // $prayer_times = $prayer ? $prayer->toArray() : []; return response()->json(['prayer_times' => $prayer_times], 200);
情况2:可能返回多条记录
如果查询条件可能匹配多条数据,将first()改为get()(返回Eloquent集合),再遍历集合中的每个模型实例:
$prayers = Prayer_time::where('mosque_id', $request->mosque_id) ->where('month', $month) ->where('date', $date) ->get(); $prayer_times = []; foreach ($prayers as $prayer) { // 方式1:提取指定字段 $prayer_times[] = [ 'fajr' => $prayer->fajr, 'dhuhr' => $prayer->dhuhr, // 其他字段按需添加 ]; // 方式2:直接转成单条记录的字段数组 // $prayer_times[] = $prayer->toArray(); } return response()->json(['prayer_times' => $prayer_times], 200);
额外提示
如果只想获取模型对应的数据库表字段(完全排除模型内置属性),可以使用$prayer->attributesToArray()方法,它仅返回数据库字段及对应值。
内容的提问来源于stack exchange,提问作者abu abu
相关产品推荐
相关产品推荐

