Laravel搜索API特殊字符处理:AB+血型查询失败问题
解决Laravel中GET参数含特殊字符
+的查询问题 问题根源
HTTP协议中,URL参数里的+会被自动解析为空格。当你发起blood_group=AB+的请求时,Laravel的Request对象接收到的实际值是AB (AB加空格),这就导致数据库里存储的AB+无法被匹配到。
解决方案
方法1:直接获取未解码的参数
Laravel的query()方法支持第三个参数$decode,设置为false就能拿到原始未解码的参数值:
if ($request->has('blood_group')) { // 第三个参数false表示不自动解码URL编码字符 $bloodGroup = $request->query('blood_group', '', false); $donorQuery->where('blood_group', $bloodGroup); }
方法2:将解析后的空格替换回+
如果前端无法修改请求方式,可以在后端把接收到的空格手动替换为+:
if ($request->has('blood_group')) { $bloodGroup = str_replace(' ', '+', $request->blood_group); $donorQuery->where('blood_group', $bloodGroup); }
额外优化:清理控制器冗余代码
你的控制器里存在重复的$donorQuery->get()调用,还有未使用的$TotaldonorList变量,可以精简为:
public function filter(Request $request) { $donorQuery = Donor::where('status', 1); if ($request->has('address')) { $donorQuery->where('address', 'LIKE', '%' . $request->address . '%'); } if ($request->has('blood_group')) { // 这里用上面的任意一种方法处理blood_group $bloodGroup = $request->query('blood_group', '', false); $donorQuery->where('blood_group', $bloodGroup); } $donorList = $donorQuery->get(); $data = [ 'donors' => $donorList, 'message' => 'Donors List', 'total_filtered' => $donorList->count(), // 过滤后的数量 'total_active' => Donor::where('status', 1)->count(), // 所有活跃捐赠者数量 'total_all' => Donor::count() // 所有捐赠者数量 ]; return response()->json($data, 200); }
内容的提问来源于stack exchange,提问作者saroj sardar
相关产品推荐
相关产品推荐

