Laravel如何根据键名前缀将请求数组拆分为id和file两类数组
Laravel 后端拆分请求参数方案
下面提供两种常用实现方式:
方案1:使用Laravel集合处理(代码最简洁)
Laravel 8及以上版本可直接用内置的str_starts_with辅助函数:
// 获取全部请求参数 $allParams = request()->all(); // 提取id开头的参数数组 $idArray = collect($allParams)->filter(fn ($val, $key) => str_starts_with($key, 'id_'))->all(); // 提取file开头的参数数组 $fileArray = collect($allParams)->filter(fn ($val, $key) => str_starts_with($key, 'file_'))->all();
如果是Laravel 8以下版本,替换为Str门面实现前缀判断:
use Illuminate\Support\Str; $allParams = request()->all(); $idArray = collect($allParams)->filter(fn ($val, $key) => Str::startsWith($key, 'id_'))->all(); $fileArray = collect($allParams)->filter(fn ($val, $key) => Str::startsWith($key, 'file_'))->all();
方案2:原生foreach遍历(兼容性最高)
不需要依赖Laravel集合特性,直接遍历参数即可:
$idArray = []; $fileArray = []; foreach (request()->all() as $key => $value) { if (str_starts_with($key, 'id_')) { $idArray[$key] = $value; // 如果需要把id后的数字当键名,也可以这么处理: // $index = ltrim($key, 'id_'); // $idArray[$index] = json_decode($value, true); } elseif (str_starts_with($key, 'file_')) { $fileArray[$key] = $value; // 建议文件参数用request()->file()方法获取,可直接拿到上传文件实例: // $index = ltrim($key, 'file_'); // $fileArray[$index] = request()->file($key); } }
额外优化建议
你前端传参时可以直接用数组格式的键名,不需要手动拼接id_、file_前缀,后端可以直接提取对应数组,不需要额外拆分:
前端代码修改示例:
const formData = new FormData(); for (var key in this.equipments) { // 用ids[]格式传参 formData.append(`ids[${key}]`, JSON.stringify(this.equipments[key])); } this.equipments.forEach((item, idx) => { // 用files[]格式传参 formData.append(`files[${idx}]`, item.New_Cert); }); axios .post("/equipments/calibration", formData, { headers: { "Content-Type": "multipart/form-data", }, })
后端直接获取即可:
$idArray = request()->input('ids'); $fileArray = request()->file('files');
内容的提问来源于stack exchange,提问作者Hanyi Koh
相关产品推荐
相关产品推荐

