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

如何在Laravel中用foreach循环遍历存储过程返回的JSON数据?

解决Laravel调用存储过程后遍历数据的问题

首先咱们先理清问题的核心根源:

  • DB::select('CALL sp_MyClientList()') 返回的是StdClass对象的数组,不是关联数组,直接用数组方式访问属性会触发htmlspecialchars错误
  • 你把数据转成JSON字符串传到视图后,它只是个普通字符串,没法直接用foreach循环,得先转成可遍历的结构

方案1:直接使用原始返回的对象数组(推荐)

完全不需要转JSON,只要修正视图里的属性访问方式就行:

控制器代码(保持原样即可)

$data = DB::select('CALL sp_MyClientList()');
return view('my-view.index', compact('data'));

视图代码(修正属性访问逻辑)

因为返回的是对象,要用->访问属性,而不是数组的[]语法:

@foreach ($data as $client)
    <div class="client-item">
        <p>客户ID:{{ $client->ClientID }}</p>
        <p>客户名称:{{ $client->Name }}</p>
        <p>余额1:{{ $client->Balance1 ?? '无' }}</p>
        <p>余额2:{{ $client->Balance2 ?? '无' }}</p>
    </div>
@endforeach

这里用?? '无'是为了处理null值,避免输出空内容或者触发不必要的警告


方案2:如果一定要用JSON传递(不推荐,属于多此一举)

如果你坚持要转成JSON传到视图,那需要在视图里先把JSON字符串解码成数组/对象再遍历:

控制器代码(保持原样)

$data = DB::select('CALL sp_MyClientList()');
$json = json_encode($data);
return view('my-view.index', compact('json'));

视图代码(先解码再遍历)

@php
    // 第二个参数传true,转成关联数组,用[]访问;不传则转成对象数组,用->访问
    $clients = json_decode($json, true);
@endphp

@foreach ($clients as $client)
    <div class="client-item">
        <p>客户ID:{{ $client['ClientID'] }}</p>
        <p>客户名称:{{ $client['Name'] }}</p>
        <p>余额1:{{ $client['Balance1'] ?? '无' }}</p>
        <p>余额2:{{ $client['Balance2'] ?? '无' }}</p>
    </div>
@endforeach

为什么你之前的嵌套循环没用?

你之前写的嵌套循环失效,是因为$json是字符串,不是数组/对象——直接foreach字符串会遍历每个字符,当然得不到想要的客户数据。而且就算解码后,也不需要嵌套循环,因为外层已经是客户列表数组,每个元素就是单个客户的完整结构。

内容的提问来源于stack exchange,提问作者arrydavid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:30:04