Laravel 5.5控制器update函数报错:Attempt to assign property of non-object
解决Laravel 5.5控制器update函数中“Attempt to assign property of non-object”错误
这个错误的原因很清晰:你把$data初始化成了数组($data = array();),但后续却用了对象属性赋值的语法($data->firstName)——数组是不能通过->来访问元素的,这就导致了“试图给非对象赋值属性”的报错。下面给你两种简单的修复方案:
方案一:使用数组赋值(推荐,符合Laravel常规用法)
直接把对象赋值语法改成数组下标赋值即可,因为Laravel的update()方法本身就支持接收数组参数:
public function update(Request $request, $id=1){ $data = []; // 和array()效果一致,更简洁的写法 $data['firstName'] = $request->get('firstName'); $data['lastName'] = $request->get('lastName'); $data['email'] = $request->get('email'); $data['company'] = $request->get('company'); $data['website'] = $request->get('website'); UserAdmin::where('id', Auth::user()->id)->update($data); return redirect('administrator/myprofile'); }
更高效的简化写法:
可以直接用$request->only()快速提取需要的字段,省去手动逐个赋值的步骤:
public function update(Request $request, $id=1){ // 直接获取指定字段的请求值,返回结果就是数组 $data = $request->only(['firstName', 'lastName', 'email', 'company', 'website']); UserAdmin::where('id', Auth::user()->id)->update($data); return redirect('administrator/myprofile'); }
方案二:改用对象赋值(不推荐,多此一举但可解决问题)
如果你坚持想用对象赋值的语法,需要先把$data初始化为一个对象,再转成数组传给update()方法(因为update()不支持直接接收对象参数):
public function update(Request $request, $id=1){ $data = new \stdClass(); $data->firstName = $request->get('firstName'); $data->lastName = $request->get('lastName'); $data->email = $request->get('email'); $data->company = $request->get('company'); $data->website = $request->get('website'); // 将对象强制转为数组后传入update方法 UserAdmin::where('id', Auth::user()->id)->update((array)$data); return redirect('administrator/myprofile'); }
额外注意事项:
要确保你的UserAdmin模型已经设置了$fillable属性,允许对这些字段进行批量赋值,否则会触发批量赋值错误:
// 在UserAdmin模型文件中添加以下代码 protected $fillable = ['firstName', 'lastName', 'email', 'company', 'website'];
内容的提问来源于stack exchange,提问作者Niladri Banerjee - Uttarpara
相关产品推荐
相关产品推荐

