ChatGPT解决这个技术问题 Extra ChatGPT

Laravel 中的“质量分配”是什么意思?

当我浏览 Laravel Document about Eloquent ORM topic part时,我得到了一个新术语“Mass Assignment”。

文档显示如何进行批量分配和 $fillable$guarded 属性设置。但是在经历了那之后,我对“Mass Assignment”及其工作原理没有一个清楚的了解。

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

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


d
duellsy

批量分配是当您将数组发送到模型创建时,基本上是一次性在模型上设置一堆字段,而不是一个接一个,例如:

$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();

感谢您的回答,我完全不明白谁会做$user = new User(Input::all());(作为程序员)这样的事情,它是如此不受控制(或者在什么情况下会有帮助)。
...这根本不是答案的重点,而是要保持答案简短而不会劫持它作为安全等方面的一堂课
我明白了,我很高兴我找到了这个答案。我只是好奇上面引用的行(在我的评论中)在什么情况下有用。我的意思是没有验证和周围的所有东西。
所以你在回答题为“Laravel 中的“Mass Assignment”是什么意思?我应该详细介绍验证......这是对问题的简单回答,不会偏离正轨。让我们保持原样。
我问的 OP 问题的意义是什么并不重要,因此我不必创建新线程,而您一直在谈论“为什么不”谈论它。我只是不明白为什么有人会在你写的时候使用 line 而不是 $user = new User; $user->name = 'Neo';
U
Udhav Sarvaiya

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

批量分配是好的,但其背后存在一定的安全问题。如果有人将值传递给模型并且没有保护,他们肯定可以修改包括 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


这直接来自 Matt Stauffer 的书“Laravel Up & Running”
m
majidarif

批量分配意味着您正在使用一组数据填充多于一列的行。 (有点像快捷方式,而不是手动构建数组)使用 Input::all()

技术上只是从我的头顶。 Fillable 表示允许插入表中的哪些列,guarded 表示模型不能插入到该特定列。

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

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


a
adiga

这是将接收到的数据数组一次保存在模型中的时候。

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

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

例如

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

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

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


O
Omar Faruk
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.