Laravel 5.6 - 无法更新枚举值

时间:2018-03-24 01:44:44

标签: php laravel-5

我在数据库中有一个enum类型的字段,可以让我知道用户是否激活了他的帐户。

以下是相应的迁移:

 /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->enum("activated", [0,1])->default(0);
            $table->enum("role", [0,1,2,3,4])->default(0);
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn(['activated', "role"]);
        });
    }

现在,如果我尝试更新此字段的值,则不会更改该值并且不会发生错误。

$user = User::find(2);
$user->activated = 1;
$user->save();

我注意到在我的模型用户中可以填写所有字段:

在App \ User

   protected $guarded = [];

有人有想法吗?

1 个答案:

答案 0 :(得分:2)

正如ceejayoz评论的那样:你应该有其他表user_roles来映射用户和角色之间的多对多关系。

为什么你的价值没有更新是因为。

  

如果将数字存储到ENUM列中,则为数字    被视为可能值的索引,以及    存储的值是具有该索引的枚举成员。    (但是,这不适用于LOAD DATA,即    将所有输入视为字符串。)如果引用了数值,    如果没有匹配,它仍然被解释为索引    枚举值列表中的字符串。对于这些    原因是,不建议定义ENUM列    枚举值看起来像数字,因为    这很容易让人感到困惑。例如,    以下列具有带字符串的枚举成员    值'0','1'和'2',但数字索引值为1,2和3:

当您存储数值时,它将其视为索引而不是值。要将其作为值,您应该使用引号"来使其成为值而不是索引。

下面

$table->enum("activated", [0,1])->default(0);
// it stores value `0` in index `1` and value `1` in index `2` 

当你这样做时

$user->activated = 1;
// `1` which is number treated as index whose value is `0`
// to tread `1` as `1` you need to pass it with quotes `'1'` or `"1"`

这意味着它会在存储时将您的值从0覆盖为0 1成为02将{{1} }}

Read from docs