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
相关产品推荐
相关产品推荐

