【问题标题】:laravel work safely with mass assignmentslaravel 安全地处理大量任务
【发布时间】:2015-03-01 00:13:17
【问题描述】:

我设置了我的 laravel 模型保护数组属性,现在我当然不能设置了

Model::create(['gaurded_field' => 'value']);

但是我怎样才能安全地插入它,我想到的唯一选择是先创建,然后执行:

$model_object = Model::create(['other_attributes' => 'other_values']);
$model_object->gaurded_field = 'value';
$model_object->save();

但这只需要 2 个数据库查询,1 个插入 1 个更新,我可以在 1 个查询中设置它们吗?

【问题讨论】:

  • 请解释为什么在Model上设置$fillable后不能做Model::create(['field' => 'value']);
  • @user2094178 如果您设置了可填充/受保护的属性,则无法将它们发送到 create 方法...因为您首先需要保护它们不被用户输入保存。跨度>

标签: php laravel eloquent models laravel-5


【解决方案1】:

你可以做的是:

$model_object = Model::fill(['other_attributes' => 'other_values']);    
$model_object->guarded_field = 'value'; 
$model_object->save();

编辑

还有一件事。如果在使用 store/update 时处理代码中的属性,则可以安全地将其添加到可填充属性中(您不需要在受保护的情况下使用它。

$input = $request->input();
$input['guarded_field'] = 'value';
$model_object = Model::create($input);

通过这种方式,您可以安全地将 guarded_field 添加到可填写字段中,因为在您的代码中,您总是会用您的值覆盖它。因此,无论用户发送什么,您都将始终设置自己的值。当然,您需要对更新执行相同的操作(或者如果您不想进行任何更改,则只需取消设置更新的用户值)。有时它可能很方便,但您需要非常小心地使用此技术。

【讨论】:

  • 非常感谢,我按照你在第一部分的建议做了,一切都很好,我宁愿不接受第二个建议,因为你有时可能会忘记。仅供参考Model::fill(),它不是静态函数,只需创建一个模型实例然后使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2018-05-08
相关资源
最近更新 更多