Laravel中update返回int而非Model实例致ActivityLogger参数错误求助
错误原因
- Laravel框架中,直接通过查询构造器调用
update()方法时,返回值为受影响的行数(整数类型),而非更新后的模型实例,这是框架的原生设计。你将返回的整数传入要求传入Illuminate\Database\Eloquent\Model实例的performedOn()方法,就会触发类型不匹配报错。
解决方案
你需要先查询得到对应的Sales模型实例,再执行更新操作,常用两种写法:
写法1:先查实例再更新
public function cancel_bill_cash_store(Request $request){ // 先查询匹配的模型实例 $sales_cancel = Sales::where('bill_number',$request->bill_number)->first(); // 调用模型实例的update方法,返回布尔值标识更新是否成功 $update_result = $sales_cancel?->update([ "cancel_bill" => 1, "bill_status" => $request->bill_status, ]); if ($update_result) { activity('Sales') ->performedOn($sales_cancel) // 传入查询得到的模型实例即可 ->causedBy($user) ->log('Cancelled Bill by ' . $user->name . ' with IP '.request()->ip()); toastr()->success(' Bill- '.$request->bill_number.' Imeshakuwa Cancelled Vizuri!, Device Zimerudi Store'); return redirect()->back(); } else { toastr()->error('Error: Kuna Kitu Kimekwenda Wrong !. Otherwise check Support.'); return redirect()->back(); } }
写法2:用tap辅助函数简化代码
如果不想单独定义变量存储更新结果,可以用Laravel提供的tap函数,直接拿到更新后的模型实例:
$sales_cancel = tap(Sales::where('bill_number',$request->bill_number)->first())->update([ "cancel_bill" => 1, "bill_status" => $request->bill_status, ]);
tap函数会忽略update()的返回值,直接返回传入的模型实例,后续直接把$sales_cancel传给performedOn()即可。
内容的提问来源于stack exchange,提问作者Melx
相关产品推荐
相关产品推荐

