You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 9 如何仅更新非空字段?需实现非空密码更新

Laravel 9 仅更新非空字段(密码字段特殊处理)

方法一:手动筛选+密码哈希处理

先过滤请求中的空字段,再单独处理密码加密逻辑,适合需要精细控制的场景:

use Illuminate\Support\Facades\Hash;

// 排除不需要的字段(比如CSRF令牌)
$input = $request->except(['_token']);

// 过滤所有空值(空字符串、null、0等),若只想过滤空字符串,可加回调:fn($val) => $val !== ''
$input = array_filter($input);

// 若密码字段存在,对其进行哈希加密
if (isset($input['password'])) {
    $input['password'] = Hash::make($input['password']);
}

// 执行模型更新
$user->update($input);

方法二:利用Laravel请求对象内置方法(更优雅)

借助filled()判断密码字段是否非空,结合filter()过滤空字段,代码更简洁:

use Illuminate\Support\Facades\Hash;

// 先过滤空字段,排除CSRF令牌
$updateData = $request->except(['_token'])->filter();

// 仅当密码字段存在且非空时,添加哈希后的密码到更新数组
if ($request->filled('password')) {
    $updateData['password'] = Hash::make($request->password);
}

$user->update($updateData);

方法三:链式调用简化写法

用when()方法实现条件式字段合并,一步完成逻辑:

use Illuminate\Support\Facades\Hash;

$user->update(
    $request->except(['_token'])
        ->filter()
        ->when($request->filled('password'), function ($request) {
            return $request->merge(['password' => Hash::make($request->password)]);
        })
);

注意事项

  • 确保你的模型(比如User)的$fillable属性包含所有允许更新的字段,否则Laravel会自动忽略未授权的字段:
    protected $fillable = ['name', 'email', 'password']; // 根据实际业务调整字段
    
  • filled()是Laravel请求对象的内置方法,会判断字段存在且不为空字符串、null,比原生isset()更贴合业务场景。

内容的提问来源于stack exchange,提问作者le genie informaticien

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 23:31:47