“大规模分配”在Laravel中意味着什么?

2022-08-30 06:23:47

当我浏览Laravel文档关于Eloquent ORM主题部分时,我得到了一个新术语“批量作业”。

文档显示如何执行批量分配和 or 属性设置。但是在经历了这一切之后,我对“大规模分配”及其工作原理并没有清晰的了解。$fillable$guarded

在我过去在CodeIgniter的经验中,我也没有听说过这个术语。

有没有人对此有一个简单的解释?


答案 1

批量分配是指将数组发送到模型创建中,基本上是一次性在模型上设置一堆字段,而不是逐个设置,如下所示:

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

(这不是在模型上单独显式设置每个值。

您可以使用 来保护您希望此字段实际允许更新的字段。fillable

您还可以通过执行以下操作来阻止所有字段可批量分配:

protected $guarded = ['*'];

假设在您的用户表中,您有一个字段,该字段可以具有用户/管理员的值user_type

显然,您不希望用户能够更新此值。从理论上讲,如果您使用上述代码,有人可以在表单中注入一个新字段,并将其“admin”与其他表单数据一起发送,并轻松将其帐户切换到管理员帐户...坏消息。user_type

加入:

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

您正在确保只有这些值可以使用mass assignment

为了能够更新该值,您需要在模型上显式设置它并保存它,如下所示:user_type

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

答案 2

批量分配是发送一个数据数组的过程,这些数据数组将立即保存到指定的模型中。通常,您不需要逐个保存模型上的数据,而是在单个过程中保存。

批量分配是好的,但背后有一定的安全问题。如果有人将值传递给模型并且没有保护,他们绝对可以修改所有字段,包括ID,该怎么办?这不好。

假设您有“学生”表,其中包含“student_type、first_name last_name”字段。您可能希望批量分配“first_name,last_name”,但希望保护student_type不被直接更改。这就是可填充守卫发生的地方。

“可填充”允许您指定哪些字段在模型中可批量分配,您可以通过向模型添加特殊变量来执行此操作。所以在模型中:$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 指定哪些字段不可分配质量。所以在模型中:

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

您应该使用$fillable或$guarded - 而不是两者兼而有之。

有关更多详细信息,请打开链接:- 批量分配


推荐