如何仅获取验证通过的字段?Laravel验证规则与$fillable设置咨询
嘿,我来帮你搞定这个问题!针对你想要只获取tags.*.tag_id、过滤掉其他无关字段的需求,有两种常用的处理方式,我给你详细拆解一下:
方法一:在控制器里手动筛选请求数据
这是最直接的方式,你可以在接收请求后,专门提取tags数组里的tag_id字段,抛弃其他不需要的内容。
比如用原生数组处理的写法:
// 先获取请求中的tags数组,默认空数组防止报错 $originalTags = $request->input('tags', []); // 遍历每个tag,只保留tag_id字段 $filteredTags = array_map(function ($tag) { // 确保tag_id存在再保留,避免空值 return isset($tag['tag_id']) ? ['tag_id' => $tag['tag_id']] : []; }, $originalTags); // 如果还要保留其他请求字段,把筛选后的tags合并进去 $finalData = $request->except('tags'); $finalData['tags'] = $filteredTags;
如果你想用Laravel提供的集合工具来简化代码,会更优雅:
use Illuminate\Support\Arr; // 提取其他需要的字段,再单独处理tags $finalData = $request->only(['title', 'content']); // 替换成你实际需要的其他字段 $finalData['tags'] = collect($request->input('tags', [])) ->map(fn($tag) => Arr::only($tag, ['tag_id'])) // 只保留tag_id ->filter() // 过滤掉没有tag_id的空元素 ->toArray();
方法二:通过模型的属性控制填充
如果你的tags是模型的JSON字段,或者通过关联关系处理,可以通过模型层来控制允许填充的内容:
情况1:tags是JSON字段
如果模型里有一个tags JSON类型的字段,你可以在模型中定义$fillable,然后通过自定义属性设置方法来自动筛选:
use Illuminate\Support\Arr; class YourModel extends Model { protected $fillable = ['other_field', 'tags']; // 允许填充tags字段 // 重写tags的属性设置器,自动过滤字段 public function setTagsAttribute($value) { $filteredTags = collect($value) ->map(fn($tag) => Arr::only($tag, ['tag_id'])) ->filter() ->toArray(); $this->attributes['tags'] = json_encode($filteredTags); } }
这样不管你往模型里传什么样的tags数据,都会自动只保留tag_id部分。
情况2:tags是多对多关联
如果tags是通过多对多关联(比如模型里有public function tags()关联方法),那不需要把tags放到$fillable里,而是直接处理关联:
// 从请求中提取所有有效的tag_id $tagIds = collect($request->input('tags', [])) ->pluck('tag_id') ->filter() // 过滤掉空的tag_id ->toArray(); // 用sync方法同步关联(会自动处理新增和移除) $yourModel->tags()->sync($tagIds);
这种方式下,模型的$fillable只需要包含你直接填充的字段,关联关系单独处理即可。
内容的提问来源于stack exchange,提问作者hoyebexor
相关产品推荐
相关产品推荐

