Laravel Request如何获取所有已填充的字段值?
当然可以!不用再写重复的判断啦
Laravel 早就为你想到了这个场景,完全可以一次性获取所有**已填充(存在且非空)**的字段值,省去一堆重复的if判断。下面给你两种常用的实现方式,按需选择:
方式一:获取所有输入中的已填充字段
如果你想接收所有用户输入里的非空字段,可以借助 Laravel 的集合和filled()辅助函数来过滤:
// 把请求数据转成集合,过滤掉空值后转回数组 $filledFields = collect($request->all()) ->filter(fn($value) => filled($value)) ->toArray(); // 直接批量赋值给模型(记得确保模型的$fillable包含这些字段!) $item->fill($filledFields); $item->save();
这里的filled($value)和$request->filled($field)逻辑完全一致:会排除null、空字符串""、空数组[]这类无效值,只保留真正有内容的字段。
方式二:仅获取指定字段中的已填充项(更安全)
如果你的模型只允许特定字段被赋值(推荐这种方式,防止批量赋值漏洞),可以先定义允许的字段列表,再筛选其中已填充的:
// 定义模型允许接收的字段 $allowedFields = ['type', 'title', 'description', 'status']; // 筛选出这些字段中已填充的项 $filledFields = collect($allowedFields) ->filter(fn($field) => $request->filled($field)) ->mapWithKeys(fn($field) => [$field => $request->input($field)]) ->toArray(); // 批量赋值并保存 $item->fill($filledFields)->save();
这种方式更严谨,能避免意外接收用户传入的非法字段,让代码更安全。
注意事项
- 不管用哪种方式,都要确保你的模型已经正确设置了
$fillable属性(列出允许批量赋值的字段),或者设置$guarded = [](不推荐,风险较高),否则fill()方法会忽略这些字段。 filled()和has()的区别:has()只判断字段是否存在(哪怕是空值),而filled()会同时判断字段存在且有有效内容,这正是你需要的场景。
内容的提问来源于stack exchange,提问作者Sunny Kumar
相关产品推荐
相关产品推荐

