Che*_*Lin 135 php mass-assignment laravel
当我通过Laravel文档了解Eloquent ORM主题部分时,我得到了一个新术语Mass Assignment
.
文档显示如何进行质量分配和fillable
或guarded
属性设置.但经过这一切,我没有清楚地了解Mass Assignment
它是如何工作的.
在我过去的CodeIgniter经历中,我也没有听说过这个术语.
有没有人对此有一个简单的解释?
due*_*lsy 182
质量赋值是指您将数组发送到模型创建时,基本上在模型中设置一堆字段,而不是逐个,例如:
$user = new User(Input::all());
Run Code Online (Sandbox Code Playgroud)
(这不是单独显式设置模型上的每个值.)
您可以使用它fillable
来保护您希望实际允许更新的字段.
假设您的用户表中有一个字段,该字段user_type
可以包含user/admin值
显然,您不希望用户能够更新此值.从理论上讲,如果你使用上面的代码,有人可以在表单中注入一个新字段user_type
,并将"admin"与其他表单数据一起发送,并轻松将其帐户切换到管理员帐户...坏消息.
通过增加:
$fillable = array('name', 'password', 'email');
Run Code Online (Sandbox Code Playgroud)
您确保只能使用更新这些值 mass assignment
为了能够更新该user_type
值,您需要在模型上显式设置并保存它,如下所示:
$user->user_type = 'admin';
$user->save();
Run Code Online (Sandbox Code Playgroud)
Udh*_*iya 22
批量分配是一个发送将一次保存到指定模型的数据数组的过程.通常,您不需要逐个地在模型上保存数据,而是在单个过程中保存.
批量分配很好,但背后有一些安全问题.如果有人将值传递给模型并且没有保护,他们肯定可以修改包括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
}
Run Code Online (Sandbox Code Playgroud)
' student_type '不包括在内,这意味着它们被免除.
守卫是可填写的逆转.如果fillable指定要批量分配的字段,则guarded指定哪些字段不可批量分配.所以在模型中:
class Student extends Model {
protected $guarded = ['student_type']; //the field name inside the array is not mass-assignable
}
Run Code Online (Sandbox Code Playgroud)
你应该使用$ fillable或$ guarded - 而不是两者.
有关详细信息,请打开链接: - 批量分配
批量分配意味着您要使用数据数组将多列填充为一行。(有点捷径而不是手动构建数组)Input::all()
。
从技术上讲,只是从我的头顶开始。Fillable表示允许插入表中的哪些列,guarded表示模型无法插入该特定列。
请注意,当您尝试使用like进行批量分配时,将其插入到名为“ secret”的列中,并且已指定该列为受保护对象,则可以尝试通过模型插入该列,但实际上不会将其插入数据库。
这是出于安全性和使用模型时对表的保护。大规模分配似乎只是一个通知或警告,您没有告诉模型可填充和受保护的模型,因此容易受到某种攻击。