“质量分配”在Laravel中意味着什么?

时间:2014-03-09 07:14:29

标签: php laravel mass-assignment

当我通过Laravel文档了解有关Eloquent ORM主题的部分时,我得到了一个新术语Mass Assignment

文档显示如何进行批量分配以及fillableguarded属性设置。但经过这一切,我对Mass Assignment及其运作方式并不清楚。

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

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

6 个答案:

答案 0 :(得分:167)

质量赋值是指将数组发送到模型创建时,基本上在模型中设置一堆字段,而不是一个一个,如:

$user = new User(Input::all());

(这不是分别在模型上明确设置每个值。)

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

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

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

添加:

$fillable = array('name', 'password', 'email');

您确保只能使用mass assignment

更新这些值

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

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

答案 1 :(得分:16)

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

群发作业很好,但背后有一定的安全问题。如果有人将值传递给模型并且没有保护,他们肯定可以修改包括ID在内的所有字段。那不好。

假设你有'学生'表,字段 “student_type,first_name,last_name” 。你可能想要批量指定“first_name,last_name”但你想要保护 student_type 不被直接更改。这就是可填写保护的地方。

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指定要批量分配的字段,则guarded指定哪些字段不可批量分配。所以在模型中:

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

你应该使用$ fillable或$ guarded - 而不是两者。

有关详细信息,请打开链接: - Mass Assignment

答案 2 :(得分:4)

批量分配意味着您使用数据数组填充包含多个列的行。 (使用Input::all()(某种快捷方式而不是手动构建数组)。

技术上从头到尾。可填充意味着允许插入表中的哪些列,保护意味着模型无法插入到该特定列。

请注意,当您尝试使用like进行批量分配时,插入名为“secret”的列,并指定它被保护,您可以尝试通过模型插入它,但它永远不会真的插入数据库。

这是为了在使用模型时保护桌面的安全性。质量分配似乎只是一个通知或警告,你没有告诉模型哪些是可填写和保护的,并且容易受到某种攻击。

答案 3 :(得分:2)

<强>更新

对于 Laravel 5.x ,您可以参考最新的文档mass assignment

OR

有关何时使用fillable or guarded

的详细说明

答案 4 :(得分:1)

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

由于laravel中此方法存在安全性问题,建议您定义希望在模型中填充所需数据的字段。

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

例如

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

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

有人可以轻松地将不需要的数据以html形式传递到您的数据库。

答案 5 :(得分:0)

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.