Laravel update报错:Call to a member function update() on null
错误根因
Call to a member function update() on null 报错没有特殊成因,就是whereIn(...)->first()没有查到匹配的expedicoes表记录,返回了null,直接在null上调用update()就会触发这个错误。
你当前代码本身有3个逻辑问题,是导致查不到记录的核心诱因:
- 遍历和拆分逻辑冲突:复选框提交的
chassis本身已经是数组,你遍历拿到单个chassis值后又调用explode(',', $chassis)拆分数组,一旦传值存在前后空格、和数据库存储值不完全匹配,就会直接查不到结果 - 没有做结果判空:
first()可能返回null的场景下,直接链式调用update,没有任何兜底判断 - 模型命名不符合框架约定:Laravel模型默认要求大驼峰命名,
expedicoes作为模型名应当写为Expedicoes,避免框架自动解析表、关联关系时出现隐性问题
修复代码
兼容原有逗号拆分逻辑的写法
如果你的业务里确实存在chassis值用逗号拼接的场景,按如下方式调整,增加结果判空、过滤空参数:
$chassis = $request->chassis; $escala = $request->escala; if (Auth::check()) { foreach ($chassis as $chassisItem) { // 拆分后过滤空值,避免无效查询条件 $targetChassis = array_filter(explode(',', trim($chassisItem))); $record = Expedicoes::whereIn('Chassis', $targetChassis)->first(); // 确认查到记录再执行更新 if ($record) { $record->update(['Estado' => 'Expedido']); } } }
高性能批量更新写法
如果复选框提交的每个chassis都是独立值,不存在逗号拼接的情况,完全不需要写循环,直接批量更新即可,从根源上避免null调用方法的问题,执行效率也更高:
if (Auth::check()) { $chassis = array_filter(array_map('trim', $request->chassis)); Expedicoes::whereIn('Chassis', $chassis)->update(['Estado' => 'Expedido']); }
额外排查点
如果改完代码还是无法正常更新,检查两个配置:
- 打印
$request->chassis的实际传值,确认传参和数据库Chassis字段存储的值完全一致,注意大小写、前后隐形空格的差异 - 确认
Expedicoes模型的$fillable白名单中已经加入Estado字段,否则会被模型拦截写入操作
内容的提问来源于stack exchange,提问作者Gustavo Aguiar
相关产品推荐
相关产品推荐

