You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 04:33:20