当我浏览 Laravel Document about Eloquent ORM topic part时,我得到了一个新术语“Mass Assignment”。
文档显示如何进行批量分配和 $fillable
或 $guarded
属性设置。但是在经历了那之后,我对“Mass Assignment”及其工作原理没有一个清楚的了解。
在我过去的 CodeIgniter 经验中,我也没有听说过这个术语。
有人对此有简单的解释吗?
批量分配是当您将数组发送到模型创建时,基本上是一次性在模型上设置一堆字段,而不是一个接一个,例如:
$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
来实现。所以在模型中:
class Student extends Model {
protected $fillable = ['first_name', 'last_name']; //only the field names inside the array can be mass-assign
}
'student_type' 不包括在内,这意味着他们被豁免。
Guarded 是 fillable 的反面。如果 fillable 指定要批量分配的字段,guarded 指定不可批量分配的字段。所以在模型中:
class Student extends Model {
protected $guarded = ['student_type']; //the field name inside the array is not mass-assignable
}
您应该使用 $fillable 或 $guarded - 不能同时使用。
欲了解更多详情,请打开链接:- Mass Assignment
批量分配意味着您正在使用一组数据填充多于一列的行。 (有点像快捷方式,而不是手动构建数组)使用 Input::all()
。
技术上只是从我的头顶。 Fillable 表示允许插入表中的哪些列,guarded 表示模型不能插入到该特定列。
请注意,当您尝试使用 like 进行批量分配时,插入名为“secret”的列,并且您已指定它是受保护的,您可以尝试通过模型插入它,但它永远不会真正插入数据库。
这是为了安全,并在使用模型时保护您的桌子。批量分配似乎只是一个通知或警告,您没有告诉模型哪些是可填充和受保护的,并且容易受到某种攻击。
这是将接收到的数据数组一次保存在模型中的时候。
由于 laravel 中此方法存在安全问题,建议您定义希望请求数据填充到模型上的字段。
您可以使用 $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:
https://i.stack.imgur.com/XYBAA.jpg
You can achieve this by adding $guarded property in model class:
https://i.stack.imgur.com/5FxHB.jpg
You can either choose $fillable or $guarded but not both.
不定期副业成功案例分享
$user = new User(Input::all());
(作为程序员)这样的事情,它是如此不受控制(或者在什么情况下会有帮助)。$user = new User; $user->name = 'Neo';