【问题标题】:How to use Laravel $request->whenHas() method?如何使用 Laravel $request->whenHas() 方法?
【发布时间】:2021-04-28 05:28:55
【问题描述】:

我正在解析 Laravel 请求对象以识别用户是否输入了任何输入,以便我可以仅使用更新后的值来更新模型。

目前我正在使用:

if (isset($request->$field) && $request->$field != $model->$field) {
     $model->$field = $request->$field;
}

我最近发现了一个 Laravel 请求方法whenHas,这似乎是完成这项任务的一种更有效的方法。

我搜索了网络和stackoverflow 的示例,但只找到了基本结构。我是 OOP 的新手,但我明白这与闭包/回调有关。

仅供参考,在我当前的代码中,我有 isset() 函数,因为响应可能包含我与模型的相关字段值进行比较的字段的空值(我当前的代码 sn-p 在“foreach( $fields 作为 $field) 函数)。

我将如何使用 whenHas 方法完成此功能?

任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: php laravel request


    【解决方案1】:
    $request->whenHas($field, function ($value) use ($field, $model) {
        $model->$field = $value;
    });
    
    // or PHP 7.4+
    
    $request->whenHas($field, fn ($value) => $model->$field = $value);
    

    如果请求具有该字段,则该输入的值将传递给您的回调。如果该字段不存在,此方法会返回 $request,或者如果运行它(该字段存在),它将返回 $request 或您从回调中返回的任何内容。

    尽管您可能根本不必这样做。如果您有特定的字段要检查,您可以遍历$request->only($fields)

    【讨论】:

    • 我发现在调用类型提示的 RequestClass 之前我无法实现这一点(见下文)。出于某种原因,当我提交表单时,模型会尝试更新每个字段值,即使它没有更改。我在控制器操作方法参数(例如 public function update(ModelUpdateRequest $request) )中键入提示一个 Laravel Request 类,这会调用 ModelUpdateRequest 类,然后我可以在其中调用 Validator 函数。
    • 当我创建数据记录时,我可以通过 Laravel 的验证器测试“用户名”的唯一性就好了,但是当我编辑记录时,我发现我必须禁用视图中的唯一字段才能按顺序不会因为违反 Laravel 的验证器“唯一”规则而出现错误(即使唯一字段值没有更改)。我正在开发一种解决方法,它正在变成一个完整的解决方案,但如果有内置的东西可以解决这个问题,我希望能避免所有这些。
    • 唯一规则有办法忽略对记录的唯一检查,否则更新时我们将无法通过唯一验证
    • 是的,但是如果用户更改了唯一字段值,则会引入另一个错误。我通过在“编辑”表单(我的解决方案的第 1 部分)中禁用需要唯一值的字段来解决这个问题,这很有效。我正在开发第 2 部分,即能够编辑独特的字段。希望有一个更简单的解决方案,我的代码可在 github.com/GeorgeBroIV/pitcanasta 获得(查看 app/Http/cControllers、app/Http/Requests/ModelUpdateRequest.php、app/Traits/InputValidateTrait.php 和 app/Traits/ModelUpdateTrait.php)
    【解决方案2】:

    我遇到的基本问题是,当用户“更新”他们的模型时,唯一字段的验证会失败。当有一个更简单的解决方案时,我试图通过 'whenHas()' 方法解决这个问题......只需将当前用户的信息添加到验证规则(例如'email' => 'unique:table,email_column_to_check,id_to_ignore')。

    【讨论】:

      猜你喜欢
      • 2020-06-20
      • 2018-04-22
      • 2017-08-08
      • 1970-01-01
      • 2016-04-18
      • 1970-01-01
      • 2023-03-21
      • 2021-05-23
      • 2017-04-10
      相关资源
      最近更新 更多