当我浏览Laravel Document about Eloquent ORM topic part时,我得到了一个新的术语“Mass Assignment”。
文档显示如何做批量分配和$fillable或$ protected属性设置。但是在经历了这些之后,我对“Mass Assignment”以及它是如何运作的并没有很清楚的了解。
在我过去使用CodeIgniter的经验中,我也没有听说过这个术语。
有人能简单解释一下吗?
当我浏览Laravel Document about Eloquent ORM topic part时,我得到了一个新的术语“Mass Assignment”。
文档显示如何做批量分配和$fillable或$ protected属性设置。但是在经历了这些之后,我对“Mass Assignment”以及它是如何运作的并没有很清楚的了解。
在我过去使用CodeIgniter的经验中,我也没有听说过这个术语。
有人能简单解释一下吗?
当前回答
质量分配是将数据数组发送到指定模型的过程。一般来说,您不需要在模型中逐个保存数据,而是在单个过程中保存数据。
大规模分配是好的,但背后存在一定的安全问题。如果有人向模型传递一个值,而没有保护,他们肯定可以修改包括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指定哪些字段要进行质量分配,那么protected指定哪些字段不可进行质量分配。所以在这个模型中
class Student extends Model {
protected $guarded = ['student_type']; //the field name inside the array is not mass-assignable
}
您应该使用$fillable或$ protected,而不是两者都使用。
欲了解更多详细信息,请打开链接:-质量分配
其他回答
这是指接收到的数据数组立即保存在模型中。
由于laravel中这种方法存在安全问题,建议您定义希望在Model上填充请求数据的字段。
可以使用$fillable变量定义要在数据库表上填充的字段。
E.g
Protected $fillable = [‘username’, ‘dob’, ‘email’,];
当laravel检测到您正在大量分配数据时,它会强制您在模型类中定义想要大量分配的字段。
有人可以很容易地将不需要的数据通过html表单传递到您的数据库。
质量分配是将数据数组发送到指定模型的过程。一般来说,您不需要在模型中逐个保存数据,而是在单个过程中保存数据。
大规模分配是好的,但背后存在一定的安全问题。如果有人向模型传递一个值,而没有保护,他们肯定可以修改包括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指定哪些字段要进行质量分配,那么protected指定哪些字段不可进行质量分配。所以在这个模型中
class Student extends Model {
protected $guarded = ['student_type']; //the field name inside the array is not mass-assignable
}
您应该使用$fillable或$ protected,而不是两者都使用。
欲了解更多详细信息,请打开链接:-质量分配
批量赋值是当你将一个数组发送到模型创建时,基本上是在模型上一次性设置一堆字段,而不是一个接一个,类似于:
$user = new User(request()->all());
(这不是在模型上分别显式地设置每个值。)
您可以使用fillable来保护您希望允许更新的字段。
你也可以通过这样做来阻止所有字段被大量分配:
protected $guarded = ['*'];
假设在你的用户表中,你有一个字段user_type,它的值可以是user / admin
显然,您不希望用户能够更新这个值。从理论上讲,如果你使用上面的代码,有人可以在表单中为user_type注入一个新字段,并发送'admin'和其他表单数据,并轻松地将他们的帐户切换到admin帐户…坏消息。
通过添加:
$fillable = ['name', 'password', 'email'];
您确保只有这些值可以使用质量赋值进行更新
为了能够更新user_type值,你需要显式地在模型上设置它并保存它,如下所示:
$user->user_type = 'admin';
$user->save();
大量赋值意味着使用一个数据数组用多个列填充一行。(有点像手动构建数组的快捷方式)使用Input::all()。
严格来说,就是从我的头顶。Fillable表示表中允许插入的列,protected表示模型不能插入到特定的列。
请注意,当您尝试对一个名为“secret”的列进行大规模赋值时,并且您已经指定了它是受保护的,您可以尝试通过模型向其插入,但它永远不会真正插入到数据库中。
这是为了安全性,并在使用该模型时保护您的表。大规模分配似乎只是一个通知或警告,表明您没有告诉模型哪些是可填充的和受保护的,并使其容易受到某种攻击。
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.