Laravel 5.8 后台表格渲染报Invalid argument supplied for foreach()错误
错误原因
ambilData方法中where条件使用单引号包裹$nama变量,单引号内的变量不会被PHP解析,实际执行的是查询nama字段等于字符串$nama的记录,大概率查询不到数据返回null- 你调用了
first()方法执行查询,该方法只会返回单个模型实例或者null,不属于可遍历的数组/集合类型,而foreach语法要求传入的参数必须是可遍历结构,所以直接触发无效参数报错 - 额外隐患:你的POST表单没有添加Laravel要求的CSRF令牌,后续提交会直接触发419页面过期错误
解决方案
方案1:你需要查询单条管理员数据(符合你现有first()的查询逻辑)
- 修正
ambilData方法的语法错误,查询不到数据时返回空模型避免后续取值报错:
public function ambilData($nama){ return data::orderby('userid')->where('nama', $nama)->first() ?? new data(); }
- 去掉Blade模板中的
@foreach和@endforeach标记,所有模板中的$rows变量替换为$datalama即可,比如:
<tr> <td>ID : </td> <td>{{ $datalama->userid }}</td> <td>Nama : </td> <td>{{ $datalama->nama }}</td> </tr>
方案2:你需要查询多条符合条件的管理员数据
- 修正
ambilData方法,将first()替换为get()返回集合,同时修复where条件的变量解析问题:
public function ambilData($nama){ return data::orderby('userid')->where('nama', $nama)->get(); }
- 优化Blade模板的遍历逻辑,增加空数据判断避免无匹配数据时触发报错:
<table border="1"> @forelse($datalama as $rows) <!-- 你原有表格代码 --> @empty <tr> <td colspan="30">暂无匹配的管理员数据</td> </tr> @endforelse </table>
通用修复:给表单添加CSRF令牌
在form标签内添加@csrf标记即可:
<form method="post" action="post_namaadmin"> @csrf <input type="text" name="txtnamaadmin" id="txtnamadmin" value="1"> <input type="submit" name="btnnamadmin" id="btnamaadmin"> </form>
内容的提问来源于stack exchange,提问作者Romario Rio
相关产品推荐
相关产品推荐

