在Laravel中,"Mass Assignment"是什么意思?

13 浏览
0 Comments

在Laravel中,"Mass Assignment"是什么意思?

我研究Laravel文档中Eloquent ORM主题部分时,接触到了一个新术语\"Mass Assignment(批量分配)\"。

文档展示了如何进行Mass Assignment并设置$fillable$guarded属性。但是在研究之后,我并没有很清楚地了解\"Mass Assignment\"是什么以及它是如何工作的。

在我之前使用CodeIgniter的经验中,我也没有听说过这个术语。

有没有人能够简单解释一下?

admin 更改状态以发布 2023年5月24日
0
0 Comments

大规模分配是一种将要保存到指定模型的数据数组一次性发送的过程。通常情况下,您不需要逐个地在模型上保存数据,而是在单个流程中进行。

大规模分配很好,但其中存在某些安全问题。如果有人向模型传递一个值,并且没有保护,他们肯定可以修改包括ID在内的所有字段。那不好。

假设您有一个带有字段 "student_type,first_name,last_name" 的“students”表。您可能希望批量分配“first_name,last_name”,但您希望保护student_type不被直接更改。这就是 fillableguarded 的作用。

fillable 允许您在模型中指定哪些字段是可以大规模分配的,您可以通过向模型添加特殊变量 $fillable 来完成。所以在模型中:

class Student extends Model {
      protected $fillable = ['first_name', 'last_name']; //only the field names inside the array can be mass-assign
} 

不包括 'student_type',这意味着它们得到了豁免。

guarded 是 fillable 的反向操作。如果 fillable 指定了哪些字段可以进行大规模分配,那么 guarded 就指定了哪些字段不可进行大规模分配。所以在模型中:

class Student extends Model {
      protected $guarded = ['student_type']; //the field name inside the array is not mass-assignable
}

您应该只使用 $fillable 或 $guarded 中的一个,而不是同时使用。

有关更多详细信息,请打开链接: 大规模分配

0
0 Comments

批量赋值是指将数组发送到模型创建中,从而一次性地设置模型上的一些字段,而不是单独设置每个值在模型中,例如:

$user = new User(request()->all());

(这是代替显式单独设置每个值在模型上的方法。)

你可以使用fillable来保护你想允许更新的字段。

你也可以通过以下方法阻止所有字段被批量赋值:

protected $guarded = ['*'];

假设在你的用户表中有一个字段user_type,可以有用户/管理员这些取值。

显然,你不希望用户能够更新该值。理论上,如果你使用了上述代码,有人可以注入到一个表单中的user_type新字段,并将'admin'与其他表单数据一起发送,很容易将他们的帐户切换为管理员帐户...这很糟糕。

通过添加:

$fillable = ['name', 'password', 'email'];

你可以确保只有这些值能够使用批量赋值 来更新。

要更新user_type值,你需要显式地将其设置在模型上并保存它:如下所示:

$user->user_type = 'admin';
$user->save();

0