You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Laravel 5.6无法更新Enum字段值问题求助

解决Laravel中Enum字段无法更新的问题

嘿,我之前也碰到过类似的Enum字段更新踩坑经历,结合Laravel的特性和数据库的限制,给你梳理几个可行的解决方案:

1. 先确认数据库层面的合法性

首先要排除数据库本身的限制问题:MySQL的ENUM字段是严格校验值的,你要更新的内容必须完全匹配迁移里定义的枚举列表(比如activated只能是01role只能是0-4)。

你可以先手动在数据库终端执行更新语句测试:

UPDATE users SET activated = 1 WHERE id = 你的用户ID;

如果这条语句报错,说明你要更新的值不在枚举范围内,或者字段本身有问题;如果成功,那问题大概率出在Laravel的代码逻辑里。

2. 检查模型的批量赋值权限

Laravel默认会保护模型的批量赋值,如果你没把activatedrole加入到模型的$fillable数组里,用User::update()或者$user->save()的时候,这些字段会被自动过滤掉。

打开你的User模型,确保这两个字段在$fillable里:

protected $fillable = ['name', 'email', 'password', 'activated', 'role'];

如果只是临时测试,也可以设置$guarded = [];(不过生产环境不推荐这么做,风险较高)。

3. 用DB门面绕开模型逻辑直接更新

有时候模型的事件、观察者或者全局作用域会干扰更新操作,你可以试试用DB门面直接执行SQL更新,绕开模型的各种逻辑:

use Illuminate\Support\Facades\DB;

// 替换成你的用户ID
DB::table('users')->where('id', $userId)->update(['activated' => 1]);

如果这样能成功,那你就要排查模型里的相关逻辑了。

4. 考虑把Enum换成TinyInt(推荐长期方案)

Enum字段虽然直观,但在Laravel和部分数据库里会有兼容性问题,而且后续要修改枚举值也很麻烦。既然你的枚举值都是数字,换成TINYINT类型会更灵活。

先安装doctrine/dbal包(Laravel修改字段类型需要它):

composer require doctrine/dbal

然后生成新的迁移来修改字段类型:

public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->tinyInteger('activated')->default(0)->change();
        $table->tinyInteger('role')->default(0)->change();
    });
}

public function down()
{
    Schema::table('users', function (Blueprint $table) {
        $table->enum("activated", [0,1])->default(0)->change();
        $table->enum("role", [0,1,2,3,4])->default(0)->change();
    });
}

执行迁移后,字段类型就改成TINYINT了,后续更新操作会顺畅很多。

5. 排查模型观察者或全局作用域

如果你的User模型注册了观察者(比如UserObserver),或者有全局作用域,可能在updating事件里修改了字段值。你可以暂时注释掉观察者的注册代码,或者检查观察者里的updating方法是否有影响activated/role的逻辑。

内容的提问来源于stack exchange,提问作者Aboubacar Ouattara

火山引擎 最新活动