Laravel中Controller向View传值失败报Undefined variable $datas如何解决
问题原因
- 传参规则理解错误:Laravel中调用
view()->with()方法传入关联数组时,会将数组的每个键作为视图中的独立变量名,对应的值为变量值。你传入的$datas数组键为username、useremail、usermobile,因此视图中只会生成这三个独立变量,不存在名为$datas的变量,这是触发Undefined variable $datas报错的直接原因。 - 视图写法逻辑错误:你当前查询的是单条用户数据,不需要用
@foreach遍历;且你传递的是字符串类型的字段值,不是对象实例,不能用->语法调用属性,属性前额外加$也属于语法错误。 - (性能优化点)控制器重复查询3次user表,存在不必要的数据库IO开销。
修复方案
方案1:直接使用已传递的独立变量(最简便)
无需修改控制器代码,直接替换视图代码即可,去掉多余的@foreach遍历:
<tr> <td>{{ $username }}</td> <td>{{ $useremail }}</td> <td>{{ $usermobile }}</td> </tr>
方案2:将整个数组作为$datas传递到视图
如果需要保留$datas变量的传参形式,先修改控制器的传参逻辑:
// 写法1:指定键名传递 return view('bunk.cashier')->with('datas', $datas); // 写法2:用compact更简洁 return view('bunk.cashier', compact('datas'));
再修改视图代码,关联数组用下标访问即可,不需要遍历:
<tr> <td>{{ $datas['username'] }}</td> <td>{{ $datas['useremail'] }}</td> <td>{{ $datas['usermobile'] }}</td> </tr>
控制器性能优化建议
将三次user表查询合并为一次,减少数据库请求:
$id = Auth::user()->id; $businessid = Bunk::where('bunkvendorid', $id)->first()->id; // 仅查询一次user表 $user = User::where('businessid', $businessid)->first(); $datas = [ 'username' => $user->name, 'useremail' => $user->email, 'usermobile' => $user->mobile ];
内容的提问来源于stack exchange,提问作者Selva
相关产品推荐
相关产品推荐

