Laravel 9报错Trying to access array offset on value of type bool求助
错误排查与解决办法
错误原因
- 查询逻辑错误导致返回布尔值:
messages::find($x)是根据模型主键查询单条记录,若找不到匹配的主键会返回bool(false);而需求是获取当前用户的所有消息,应该用条件查询返回集合。当视图遍历布尔值false时,每次迭代的变量为布尔类型,访问$mssg["objMessage"]就会触发Trying to access array offset on value of type bool错误。 - 循环变量名冲突:视图中
@foreach ($mssg as $mssg)将循环变量与集合变量重名,会覆盖原集合对象,导致循环逻辑混乱。 - 调试代码阻断执行流程:控制器中的
dd($m["idUser"])会直接终止程序,永远无法执行到返回视图的代码。 - 视图传参格式错误:返回视图时传入两个独立数组,Laravel仅接收第一个数组作为视图数据,第二个数组的
idd变量无法传递到视图。
修复后的代码
控制器代码
function indexe() { $userId = Auth::User()->id; $userName = Auth::User()->name; // 按用户ID查询所有消息,返回集合(无数据时返回空集合而非false) $mssg = messages::where('idUser', $userId)->get(); // 移除阻断流程的调试代码 // foreach($mssg as $m) { // dd($m["idUser"]); // } // 用单个关联数组传递视图数据 return view('liate_message', [ "mssg" => $mssg, "idd" => $userName ]); }
视图代码
@foreach ($mssg as $message) <!-- 重命名循环变量,避免覆盖原集合 --> <tr> <td>{{ $message["objMessage"] }}</td> <td>{{ $message["estDateMessage"] }}</td> <td> @if($message["active"] == 0) 消息未读 @else 消息已读 @endif </td> <td><button><a href="/mssg">查看</a></button></td> <td><button>删除</button></td> </tr> @endforeach
额外说明
- 确保
messages模型对应的数据库表中存在idUser字段,用于关联用户ID。 where()->get()会返回Eloquent集合(即使无匹配数据也是空集合),不会返回布尔值,彻底避免了数组偏移访问错误。- 循环变量与集合变量分开命名,避免变量覆盖导致的逻辑异常。
内容的提问来源于stack exchange,提问作者Ilyas Haouaz
相关产品推荐
相关产品推荐

