【问题标题】:What does "Mass Assignment" mean in Laravel?Laravel 中的“质量分配”是什么意思?
【发布时间】:2014-04-12 07:58:46
【问题描述】:

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

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

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

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

【问题讨论】:

标签: php laravel eloquent mass-assignment


【解决方案1】:

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

$user = new User(request()->all());

(这不是在模型上单独显式设置每个值。)

您可以使用fillable 来保护您希望它实际允许更新的字段。

您还可以通过执行以下操作阻止所有字段可批量分配:

protected $guarded = ['*'];

假设在您的用户表中,您有一个字段为 user_type,并且可以包含用户/管理员的值

显然,您不希望用户能够更新此值。理论上,如果您使用上面的代码,有人可以为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';
【解决方案2】:

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

批量分配是好的,但背后存在一定的安全问题。如果有人将值传递给模型并且没有保护,他们肯定可以修改包括 ID 在内的所有字段。这不好。

假设您有 'students' 表,其中包含字段 “student_type, first_name, last_name”。您可能想要批量分配“first_name, last_name”,但您想要以保护 student_type 不被直接更改。这就是 fillableguarded 发生的地方。

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”
【解决方案3】:

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

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

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

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

【讨论】:

    【解决方案4】:

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

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

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

    例如

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

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

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

    【讨论】:

      【解决方案5】:
      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.
      

      【讨论】:

        猜你喜欢
        • 2012-02-12
        • 2019-11-03
        • 2016-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-29
        • 2016-03-12
        • 2016-09-17
        相关资源
        最近更新 更多