Laravel查询模型时如何将数组传入where条件获取对应数据
问题原因
- 核心问题是传入
whereIn的$categorypro数组存在键冲突元素丢失:你给出的数组示例中,下标1同时对应值8和5,PHP数组的键具有唯一性,后续赋值的5会覆盖之前的8,最终实际传入查询的数组只有[4,5],分类ID为8的数据自然无法返回。 - 次要问题是参数未做校验过滤:如果前端传递的
categorypro是逗号拼接的字符串而非数组格式,$request->get('categorypro')会返回字符串,直接传入whereIn会导致查询逻辑异常,同时也存在SQL注入风险。 - 额外风险:当前代码未对空数组场景做判断,如果
$categorypro是空数组,whereIn会生成category_id in ()的非法SQL,直接抛出异常。
修复方案
第一步:修复参数传递逻辑
前端提交多值参数时,参数名需要加[]后缀,例如AJAX提交时参数写为categorypro[]: [4,8,5],才能保证PHP正常接收为完整数组,不会出现值覆盖的情况。
第二步:优化后端代码健壮性
function filter_each_video(Request $request){ if($request->ajax()){ // filled方法直接判断参数存在且不为空,替代原有has+非空判断更简洁 if($request->filled('categorypro')){ // 强制转为数组,过滤无效值、去重、转整数避免注入风险 $categorypro = (array)$request->get('categorypro'); $categoryIds = array_unique(array_filter(array_map('intval', $categorypro))); // 空数组判断,避免生成非法SQL if(!empty($categoryIds)){ $item = Item::whereIn('category_id', $categoryIds)->get(); } else { // 可自定义空数组场景的返回逻辑,示例为返回空集合 $item = collect(); } } } }
内容的提问来源于stack exchange,提问作者Praful
相关产品推荐
相关产品推荐

