我在数据库中有一个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 = [];
有人有想法吗?
答案 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
成为0
。2
将{{1} }}