当我通过Laravel文档了解有关Eloquent ORM主题的部分时,我得到了一个新术语Mass Assignment
。
文档显示如何进行批量分配以及fillable
或guarded
属性设置。但经过这一切,我对Mass Assignment
及其运作方式并不清楚。
在我过去的CodeIgniter经历中,我也没有听说过这个术语。
有没有人对此有简单的解释?
答案 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)
答案 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:
You can achieve this by adding $guarded property in model class:
You can either choose $fillable or $guarded but not both.