Laravel中如何用foreach循环在Blade打印数组单个键值对
解决Laravel控制器传数组到Blade模板并遍历打印单个值的问题
问题分析
你的代码存在两个核心问题,导致Blade无法正确读取单个字段值:
DB::get()返回的是Collection集合对象,不是普通数组,循环中每次get()还会生成新的Collection,最终$show_friend_request_Data是嵌套的集合数组,直接遍历无法拿到用户字段。- 循环执行数据库查询会造成N+1性能问题,查询效率极低。
优化控制器代码
先重构查询逻辑,一次性获取所有需要的用户数据,避免循环查询:
public function show_friend_request() { $user_id = auth()->user()->id; // 提取所有待处理请求的发送者ID数组 $senderIds = DB::table('friendships') ->where('recipient_id', $user_id) ->where('status', 'pending') ->pluck('sender_id') ->toArray(); // 批量查询所有发送者的用户信息 $show_friend_request_Data = DB::table('users') ->whereIn('id', $senderIds) ->select('id', 'first_name', 'last_name') ->get(); return view('pages.friend_request')->with('Active_Request', $show_friend_request_Data); }
Blade模板正确遍历取值
现在$Active_Request是用户信息的Collection集合,直接遍历并通过字段名获取单个值:
@foreach($Active_Request as $friend) <li> <div class="rounded badge-unread d-sm-flex border-0 mb-1 p-3 position-relative"> <!-- Avatar --> <div class="avatar text-center"> <img class="avatar-img rounded-circle" src="assets/images/avatar/01.jpg" alt="{{ $friend->first_name }}"> </div> <!-- Info --> <div class="mx-sm-3 my-2 my-sm-0"> <p class="small mb-2"><b>{{ $friend->first_name }} {{ $friend->last_name }}</b> sent you a friend request.</p> <!-- Button --> <div class="d-flex"> <button class="btn btn-sm py-1 btn-primary me-2">Accept</button> <button class="btn btn-sm py-1 btn-danger-soft">Delete</button> </div> </div> </div> </li> @endforeach
兼容原有逻辑的临时写法(不推荐)
如果不想修改控制器代码,需要在Blade里处理嵌套集合,取出单个用户数据:
@foreach($Active_Request as $friendCollection) @php $friend = $friendCollection->first(); @endphp <li> <div class="rounded badge-unread d-sm-flex border-0 mb-1 p-3 position-relative"> <!-- Avatar --> <div class="avatar text-center"> <img class="avatar-img rounded-circle" src="assets/images/avatar/01.jpg" alt=""> </div> <!-- Info --> <div class="mx-sm-3 my-2 my-sm-0"> <p class="small mb-2"><b>{{ $friend->first_name }} {{ $friend->last_name }}</b> sent you a friend request.</p> <!-- Button --> <div class="d-flex"> <button class="btn btn-sm py-1 btn-primary me-2">Accept</button> <button class="btn btn-sm py-1 btn-danger-soft">Delete</button> </div> </div> </div> </li> @endforeach
内容的提问来源于stack exchange,提问作者Muhammad Khan
相关产品推荐
相关产品推荐

