You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 22:10:43