什么是“质量分配”;在Laravel?

当我浏览Laravel文档关于雄辩的ORM主题部分时,我得到了一个新的术语“质量分配”。

文档显示如何进行质量分配和$fillable$guarded属性设置。但是在经历了这些之后,我对“质量分配”并没有一个清晰的理解。以及它是如何工作的。

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

有人能简单解释一下吗?

108055 次浏览

大量赋值意味着使用一个数据数组用多个列填充一行。(某种程度上代替手动构建数组的快捷方式)使用Input::all()

严格来说,就是从我的头顶。Fillable表示表中允许插入的列,protected表示模型不能插入到特定的列。

请注意,当您尝试对一个名为“secret”的列进行大规模赋值时,并且您已经指定了它是受保护的,您可以尝试通过模型向其插入,但它永远不会真正插入到数据库中。

这是为了安全性,并在使用该模型时保护您的表。大规模分配似乎只是一个通知或警告,表明您没有告诉模型哪些是可填充的和受保护的,并使其容易受到某种攻击。

批量赋值是当你将一个数组发送到模型创建时,基本上是在模型上一次性设置一堆字段,而不是一个接一个,类似于:

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

(这不是在模型上分别显式地设置每个值。)

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

你也可以通过这样做来阻止所有字段被大量分配:

protected $guarded = ['*'];

假设在用户表中有一个字段user_type,它的值可以是user / admin

显然,您不希望用户能够更新这个值。从理论上讲,如果你使用上面的代码,有人可以在表单中为user_type注入一个新字段,并发送'admin'和其他表单数据,并轻松地将他们的帐户切换到管理帐户…坏消息。

通过添加:

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

你正在确保只有这些值可以使用mass assignment更新

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

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

质量分配是将数据数组发送到指定模型的过程。一般来说,您不需要在模型中逐个保存数据,而是在单个过程中保存数据。

大规模分配是好的,但背后存在一定的安全问题。如果有人向模型传递一个值,而没有保护,他们肯定可以修改包括ID在内的所有字段。这可不太好。

假设你有一个'students'表,字段为"student_type, first_name, last_name " .。你可能想批量分配"first_name, last_name",但你想保护student_type不被直接改变。这就是fillable守卫发生的地方。

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”不包括在内,这意味着它们是免税的。

卫兵是可填充的反面。如果fillable指定哪些字段要进行质量分配,那么protected指定哪些字段不可进行质量分配。所以在这个模型中

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

您应该使用$fillable或$ protected,而不是两者都使用。

欲了解更多详细信息,请打开链接:- 大量的任务

这是指接收到的数据数组立即保存在模型中。

由于laravel中这种方法存在安全问题,建议您定义希望在Model上填充请求数据的字段。

你可以使用$fillable变量来定义你想要在数据库表中填充的字段。

Protected $fillable = [‘username’, ‘dob’, ‘email’,];

当laravel检测到您正在大量分配数据时,它会强制您在模型类中定义想要大量分配的字段。

有人可以很容易地将不需要的数据通过html表单传递到您的数据库。

There are two ways to handle this.


Laravel Eloquent provides an easy way to achieve this.
In your model class, add $fillable property and
specify names of columns in the array like below:

enter image description here

You can achieve this by adding $guarded property in model class:

enter image description here

You can either choose $fillable or $guarded but not both.