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

Laravel 9通过Tinker批量更新Enum字段值时出现静态调用报错求助

问题分析与解决

错误原因

你遇到的错误提示说明代码实际调用了Illuminate\Database\Eloquent\Model的非静态update方法,而非查询构造器的批量更新方法。通常有两种触发场景:

  • 你的Domain模型重写了update方法,但未兼容批量更新的逻辑
  • 直接传入字符串给Enum字段时,Laravel未正确完成类型转换,导致查询构造器的执行逻辑被中断

正确操作步骤

1. 确认Enum类与模型绑定正确

首先确保你的状态Enum类定义规范(以StatusEnum为例):

namespace App\Enums;

enum StatusEnum: string
{
    case Expired = 'expired';
    case Pending = 'pending';
}

然后在Domain模型中配置字段类型转换,让Laravel识别Enum类型:

namespace App\Models;

use App\Enums\StatusEnum;
use Illuminate\Database\Eloquent\Model;

class Domain extends Model
{
    protected $casts = [
        'status' => StatusEnum::class,
    ];
}

2. 使用Enum常量而非字符串执行更新

在Tinker中,直接传入Enum枚举实例而非字符串,确保类型转换正确:

// 先导入Enum类
use App\Enums\StatusEnum;

// 执行批量更新
Domain::where('status', StatusEnum::Expired)->update(['status' => StatusEnum::Pending]);

3. 排查模型自定义update方法

如果你的Domain模型重写了update方法(比如添加了自定义业务逻辑),会导致查询构造器的批量更新调用到模型的非静态方法。此时可以通过DB门面绕开模型自定义逻辑,直接操作数据表:

DB::table('domains')->where('status', 'expired')->update(['status' => 'pending']);

内容的提问来源于stack exchange,提问作者Ryan H

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 09:50:30